type'a tree =空| 'a *'樹*'樹的節點;;如何理解類型定義?
它是一個類型定義,其中a
是一種類型的參數,tree
是類型的名字嗎?
在Node of
,是Node
一個內置類型的OCaml? of
是什麼意思?
謝謝。
type'a tree =空| 'a *'樹*'樹的節點;;如何理解類型定義?
它是一個類型定義,其中a
是一種類型的參數,tree
是類型的名字嗎?
在Node of
,是Node
一個內置類型的OCaml? of
是什麼意思?
謝謝。
是'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
Shape
和Rectangle
是標籤(再次構造函數),我只是做了,讓我來構建shape
類型的值(在這種情況下,我選擇了有Shape
只取一個參數,因爲只有長度需要指定一個正方形,而Rectangle
需要長度和寬度)。從來沒有一種類型的Shape
或Rectangle
,但事情可以有一種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來獲取更多細節。
該類型定義:
type 'a tree = Empty | Node of 'a * 'a tree * 'a tree;;
以下是大致的「事實」 OCaml的編譯器知道關於此基礎上:
tree
是一元型構造。這意味着對於任何類型的t
,t tree
也是一種類型(例如:int tree
)。Empty
是'a tree
的0元構造函數。這意味着Empty
對於任何t
都有類型t tree
。Node
是3元構造函數。這裏,這意味着如果a
具有類型t
,b
具有類型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) -> ...
)。
謝謝。 'Node'是一個類型構造函數,即一個構造類型的構造函數? 'Node'是否需要定義? – Tim
@Tim是它是一個類型構造函數,因此不需要定義實現 – badcook
爲什麼不需要定義'Node'?如果'Node'沒有定義,那麼''樹'是一個未定義的類型? – Tim