2017-09-03 158 views
1

type'a tree =空| 'a *'樹*'樹的節點;;如何理解類型定義?

它是一個類型定義,其中a是一種類型的參數,tree是類型的名字嗎?

Node of,是Node一個內置類型的OCaml? of是什麼意思?

謝謝。

回答

4

'a是一個類型參數,tree是一個類型名稱(這些通常在OCaml中稱爲變體)。這與大多數其他語言的順序相反。 Node是一個構造函數(在OCaml中稱爲標籤),而of僅僅是OCaml中的一個關鍵字,用於指定構造函數參數的類型。 Node不是一個內置的OCaml類型(它甚至不是一個類型,而是我所說的構造函數)。

因此Node (5, Empty, Node (6, Empty, Empty))int tree類型的東西(類似於Java中的Tree<Int>)。

如果你從一個簡單的變體開始,它可能會更有意義。

type shape = Square of int | Rectangle of int * int 

ShapeRectangle是標籤(再次構造函數),我只是做了,讓我來構建shape類型的值(在這種情況下,我選擇了有Shape只取一個參數,因爲只有長度需要指定一個正方形,而Rectangle需要長度和寬度)。從來沒有一種類型的ShapeRectangle,但事情可以有一種shape。讀取在英國該行

的一種方式是「我已經定義了一個稱爲shape類型。甲shape是一個單一的整數的Square,或兩個整數的Rectangle」。

現在也許由於某種原因,我也想標籤我的形狀。

type 'label labelledshape = LabelledSquare of 'label * int | LabelledRectangle of 'label * int * int 

引證'區別在於label不是類型(如int),相反卻是可變的。這讓我寫類似LabelledSquare ("a label for a square", 5)這類型的string labelledshape

注意的是,雖然這允許多態性,這些都不是所謂的OCaml中「多態性變異」。我不會在此討論這個問題,而只是推薦查看OCaml文檔或瀏覽Stack Overflow來獲取更多細節。

+0

謝謝。 'Node'是一個類型構造函數,即一個構造類型的構造函數? 'Node'是否需要定義? – Tim

+0

@Tim是它是一個類型構造函數,因此不需要定義實現 – badcook

+0

爲什麼不需要定義'Node'?如果'Node'沒有定義,那麼''樹'是一個未定義的類型? – Tim

1

該類型定義:

type 'a tree = Empty | Node of 'a * 'a tree * 'a tree;; 

以下是大致的「事實」 OCaml的編譯器知道關於此基礎上:

  • tree是一元型構造。這意味着對於任何類型的tt tree也是一種類型(例如:int tree)。
  • Empty'a tree的0元構造函數。這意味着Empty對於任何t都有類型t tree
  • Node是3元構造函數。這裏,這意味着如果a具有類型tb具有類型t tree,和c has type噸樹, then節點(A,B,C)has type噸樹(note: that's the same t`)
  • 那些是具有類型的值的只有兩種方式t tree。這意味着您可以使用模式匹配(match ... with | Empty -> ... | Node (a, b, c) -> ...)。