答えて
OPはC++言語での経験があるので、以下の説明が参考になると思います。フォームの型宣言:
は、'a list
ジェネリックリストたとえばC++
template <typename a> class t;
に近接していて、'a
は、要素のタイプです。簡潔にするため、template <typename _>
の代わりに'
という単一の文字を使用します。 OCamlの用語では、「ジェネリックプログラミング」の代わりに「パラメトリックポリモーフィズム」という用語を使用します。また、単語テンプレートの代わりに、型コンストラクタがあります。後者は興味深い結果をもたらします。 C++の場合と同様に、テンプレートインスタンス化では、OCamlでは多態型の型変数をコンサーセル化して新しい型を作成します。たとえば、int list
、float list
(c.f.、list<int>
、float<list>
)です。したがって、型コンストラクタ'a list
を型レベルで単項関数として見ることができ、型を受け取り、型を作成します。例えば、type ('key, 'value) hashtbl
は、与えられたkey
とvalue
の組の型を作成するバイナリ型のコンストラクタであるような、nary型のコンストラクタを持つことが可能です。さらに、非パラメトリック型はnullary型のコンストラクタとして見ることができるので、int
は型int
を構築します。
P.S.OCamlの子孫であるF#言語は、両方の形式で書くことができます:int t
とt<int>
P.P.S混乱を避けるために、テンプレートとパラメトリックタイプは同じ問題を解決しようとしていますが、まだ違いはほとんどありません。テンプレートはインスタンス化の後にタイプされ、前にパラメトリックタイプが入力されます。だからパラメトリックタイプ'a t
はすべて'a
のためにと定義されています。タイプ変数が普遍的に定量化されていないタイプを作成したい場合は、別のメカニズム、つまりファンクションを使用することができます。テンプレートにも非常に近いですが、C++の概念であるタイププラス型の要件を受け入れます。概念はOCamlのモジュール型で具体化されています。したがって、ファンクタは実際にはモジュールを受け取り、モジュールを生成するため、モジュールレベルの関数です。
これはパラメトリック型宣言です。
型宣言は、新しいデータ型を宣言することができます。今で
type 'a container = 'a * string * 'a
let x : int container = (0, "hello", 1)
let y : string container = ("stack", "over", "flow")
:
type my_type = int * string
let x : my_type = (42,"Sorry for the inconvenience")
は時々しかし、あなたはそれが引数として別の型を取る意味、タイプはパラメトリックになりたいですその場合、型宣言の後には等号はありません。その意味は、それがモジュールのstructure
(のような、.ml
ファイルの上)または(.mli
中など)signature
であるかのかどうかによって異なり
それが構造内にある場合、それは無いとタイプを宣言内部の価値。これは空の集合と同じくらい有用です(時にはそうですが、多くはありません)。ただし、署名内にある場合は、「パラメトリック定義がどこかに存在しますが、ここからは表示されません」という意味です。
これら二つのファイルa.ml
とa.mli
があるとします
(* a.ml *)
type 'a t = Nil | Cons of 'a * 'a t
let empty = Nil
let add x l = Cons (x,l)
(* and so on... *)
(* a.mli *)
type 'a t
val empty : 'a t
val add : 'a -> 'a t -> 'at
(* and so on... *)
あなたがA.t
タイプを操作したいあなたのプログラムの残りの部分では、あなただけempty
とadd
を通じてそうすることができます場合はその他の定義された関数を使用しますが、Nil
とCons
を直接使用することはできません。
- 1. OCaml - シグネチャ、モジュール、タイプ
- 2. OCaml評価関数の構文エラー
- 3. OCamlの構文エラーです...
- 4. OCaml相当のタイプ
- 5. OCamlパターンマッチングに関する構文
- 6. PHP構文$ {「{$タイプ} _method」}
- 7. LINQの構文<T>
- 8. zipE :: Event t a - >イベントt b - >イベントt(a、b)
- 9. OCamlユーザ定義タイプのソートリスト
- 10. T-SQL実行文の構文エラー
- 11. JSP構文エラーA-のhref
- 12. OCamlのループ中に構文エラーが発生する
- 13. AT&T構文の意味(%eax)?
- 14. OCamlの-ppx構文拡張の状態はどうですか?
- 15. 何が:!:Mean?
- 16. タイプの脱構築
- 17. 匿名タイプのIEnumerable <T>を注文するには?
- 18. OCamlのCPS:タイプがチェックされない
- 19. 変数宣言の構文は? VaRのA =(関数(){})()
- 20. サブルーチンの定義$ mean
- 21. String []タイプのMavenパラメータの構文
- 22. メソッド呼び出しの構文で錆のタイプのヒント
- 23. テンプレートエラー:nontype ".. [T = T]はタイプ名ではありません"
- 24. OcamlのFunctor
- 25. ocamlのオプション文字列
- 26. のOCaml - Lazy.force
- 27. MEAN npm install
- 28. Ocamlで文字列にツリー構造を高速に印刷する方法は?
- 29. OCaml、Scala、Goの構造型の実装
- 30. Ocamlバリアントタイプ
[Ocaml Variant Types]の可能な複製(http://stackoverflow.com/questions/4777744/ocaml-variant-types) – Laurel