2011-01-22 5 views
5

こんにちは、これは初めてのスタックオーバーフローの投稿です。OCamlで型を構築しようとしているときに問題が発生しました。OCamlの再帰型ですか?

ノード/リーフ/ etcを持つタイプツリーを構築しようとしています。これは私がこれまで持っていたものです。

私のノードは、その名前と別のツリーをタプルとして含む型であると考えられます。しかし、これをコンパイルしようとすると、ツリーには2つの引数が必要であると言われました。だから私は試しました:

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

私はまだエラーが発生していました。私が間違っていることに気づいたものは何ですか?ありがとう!

おそらくPS

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

かかわらず、あなたのノードは、2つの、複数の子を持って欲しい

+0

私の文法は間違っていました。実際には ノード( 'a *(' a、 'b)ツリー) – Brian

+1

が正しいはずです。それはあなたの質問に答えるので、ガスチェスの答えを受け入れることは丁寧です。私はあなたが葉と内部のノードのための明確な型を必要としていると確信しているのだろうか? –

答えて

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

:最初は、コンストラクタFooです:Foo of bar * bazFoo of (bar * baz)が同じではない、型宣言よりも注意してください2つのフィールドでは、2番目のフィールドには1つのフィールドしかありません。タイプは(bar * baz)です。

+0

コンストラクタ定義のカッコを省略した場合の影響を説明できますか?私は、 'bar * baz'はタプルを定義する単純な方法だと思っていました。 – Antoine