答えて
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. OCaml評価関数の構文エラー
- 7. OCamlの構文エラーです...
- 8. ocamlのタイプを拡大
- 9. Python用Numpy .T構文
- 10. OCamlのファンクタとタイプの問題
- 11. OCaml相当のタイプ
- 12. T-SQL関数の構文
- 13. OCamlパターンマッチングに関する構文
- 14. 単純なOCaml関数の構文エラー?
- 15. LINQの構文<T>
- 16. 文字AとTとTをAで置き換える方法
- 17. A Gradleのタスク(タイプ:Execの)構成フェーズ
- 18. OCamlの分散(+ '、-'a)及び不変
- 19. PHP構文$ {「{$タイプ} _method」}
- 20. (タイプ)Swiftの構文
- 21. zipE :: Event t a - >イベントt b - >イベントt(a、b)
- 22. T-SQL実行文の構文エラー
- 23. OCamlユーザ定義タイプのソートリスト
- 24. Ocamlは2つの文字列を連結して、a^b = b^a
- 25. OCamlのループ中に構文エラーが発生する
- 26. JSP構文エラーA-のhref
- 27. シンプルでOCamlの構文エラーにされたif-then-else
- 28. AT&T構文の意味(%eax)?
- 29. OCamlの-ppx構文拡張の状態はどうですか?
- 30. OCamlの入れ子構造
[Ocaml Variant Types]の可能な複製(http://stackoverflow.com/questions/4777744/ocaml-variant-types) – Laurel