2011-01-22 125 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