2011-01-22 160 views
5

嗨,這是我第一次發佈堆棧溢出,我遇到了一個問題,而試圖在OCaml中構建一個類型OCaml中的遞歸類型?

我試圖構造一個類型樹,有節點/葉/ etc。這是我迄今爲止所擁有的。

type ('a, 'b) tree = Empty | Leaf of 'b | Node of ('a * tree) | .... 

我的節點應該是一個包含它的名稱和另一個樹作爲元組的類型。但是當我試圖編譯它時,它說樹需要兩個參數。所以我嘗試過:

type ('a, 'b) tree = Empty | Leaf of 'b | Node of ('a * tree ('a*'b)) 

我仍然收到錯誤。任何你注意到我做錯了?謝謝!

+0

原來我的語法錯了。它實際上應該是 節點('a *('a,'b)樹) – Brian

+1

沒錯。雖然接受gasche的答案會很禮貌,因爲它確實回答了你的問題。我想知道你是否確定你想要葉子和內部節點的不同類型? –

回答

9
type ('a, 'b) tree = Empty | Leaf of 'b | Node of 'a * ('a, 'b) tree 

您可能希望用戶節點的兩個有一個以上的孩子,雖然

type ('a, 'b) tree = Empty | Leaf of 'b | Node of ('a, 'b) tree * 'a * ('a, 'b) tree 

PS:謹防不是在一個類型聲明,Foo of bar * bazFoo of (bar * baz)是不一樣的:首先是一個構造Foo有兩個字段,第二個字段只有一個字段,類型爲(bar * baz)

+0

您能否解釋在構造函數定義中忽略括號的影響?我認爲'bar * baz'只是一種簡單的定義元組的方法。 – Antoine