2017-09-03 5 views
1

タイプ 'a tree = Empty | 'a *'ツリーのノード* 'a tree;タイプ定義を理解するには?

aがタイプパラメータで、タイプ名がtreeのタイプ定義ですか。

Node ofには、NodeのOCamlが組み込まれていますか? ofとはどういう意味ですか?

ありがとうございました。

答えて

4

はい'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 

ShapeRectangleは唯一の長さがあるので、私はちょうど私がタイプ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を参照することをお勧めします。そのタイプ定義から

+0

ありがとうございました。 'Node'はタイプコンストラクタ、つまり型を構築するコンストラクタですか? 'Node'を定義する必要はありますか? – Tim

+0

@Timはいそれは型コンストラクタなので、実装を定義する必要はありません – badcook

+0

なぜ 'Node'を定義する必要はありませんか? 'Node'が定義されていない場合、' 'a tree 'は未定義の型ですか? – Tim

1

  • treeは単項型コンストラクタです:

    type 'a tree = Empty | Node of 'a * 'a tree * 'a tree;; 
    

    ここでは、おおよそのOCamlコンパイラはそれについてに基づいて知っていることを「事実」です。つまり、タイプtの場合、t treeも同様のタイプです(例:int tree)。

  • Emptyは、'a treeの0世代のコンストラクタです。つまり、Emptytの場合はt treeとなります。
  • Nodeは3つのコンストラクタです。ここでこれはba場合はt型を持つことを意味する
  • もの種類の値を有するように2つだけの方法である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) -> ...)を使用できます。
関連する問題