タイプ 'a tree = Empty | 'a *'ツリーのノード* 'a tree;タイプ定義を理解するには?
a
がタイプパラメータで、タイプ名がtree
のタイプ定義ですか。
Node of
には、Node
のOCamlが組み込まれていますか? of
とはどういう意味ですか?
ありがとうございました。
タイプ 'a tree = Empty | 'a *'ツリーのノード* 'a tree;タイプ定義を理解するには?
a
がタイプパラメータで、タイプ名がtree
のタイプ定義ですか。
Node of
には、Node
のOCamlが組み込まれていますか? of
とはどういう意味ですか?
ありがとうございました。
はい'a
はタイプパラメータであり、tree
はタイプ名です(これらは通常OCamlでバリアントと呼ばれます)。これは他のほとんどの言語とは逆の順序です。 Node
はコンストラクタ(OCamlではタグと呼ばれます)であり、of
はコンストラクタ引数の型を指定する単なるOCamlのキーワードです。 Node
はOCamlの組み込み型ではありません(型でもなく、私が言ったように、コンストラクタです)。
したがって、(Javaの場合はTree<Int>
のようなもの)ののものがNode (5, Empty, Node (6, Empty, Empty))
です。
より簡単な変形から始める方が意味があります。
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を参照することをお勧めします。そのタイプ定義から
:
tree
は単項型コンストラクタです: type 'a tree = Empty | Node of 'a * 'a tree * 'a tree;;
ここでは、おおよそのOCamlコンパイラはそれについてに基づいて知っていることを「事実」です。つまり、タイプt
の場合、t tree
も同様のタイプです(例:int tree
)。
Empty
は、'a tree
の0世代のコンストラクタです。つまり、Empty
はt
の場合はt tree
となります。Node
は3つのコンストラクタです。ここでこれはb
、a
場合はt
型を持つことを意味するt tree
を入力し、c has type
トンツリー, then
ノード(A、B、C)has type
Tツリー(note: that's the same
T ')を有していますt tree
。つまり、パターンマッチング(match ... with | Empty -> ... | Node (a, b, c) -> ...
)を使用できます。
ありがとうございました。 'Node'はタイプコンストラクタ、つまり型を構築するコンストラクタですか? 'Node'を定義する必要はありますか? – Tim
@Timはいそれは型コンストラクタなので、実装を定義する必要はありません – badcook
なぜ 'Node'を定義する必要はありませんか? 'Node'が定義されていない場合、' 'a tree 'は未定義の型ですか? – Tim