1
どうやら下の2つのタイプが異なるのですが、なぜですか?Ocamlタプル型ミスアンダー
type 'a llist = Nil | Cons of ('a * unit -> 'a llist)
対
type 'a llist = Nil | Cons of 'a * (unit -> 'a llist)
Cons
は、両方のケースでは、引数としてタプルを取ることはありませんか?
どうやら下の2つのタイプが異なるのですが、なぜですか?Ocamlタプル型ミスアンダー
type 'a llist = Nil | Cons of ('a * unit -> 'a llist)
対
type 'a llist = Nil | Cons of 'a * (unit -> 'a llist)
Cons
は、両方のケースでは、引数としてタプルを取ることはありませんか?
微妙な違いですが、表現が異なります。これは、次の例で見ることができます。
type ta = A of int * int
type tb = B of (int * int)
A
は二つの引数を持つコンストラクタで、B
は、単一のタプル引数を持つコンストラクタです。
実行時にオブジェクトのサイズを検査することによって違いを見ることができます:
let size x =
Obj.size (Obj.repr x)
let() = Printf.printf "%d %d\n" (size (A (2, 3))) (size (B (2, 3)))
これは「2 1」を表示します - 第二のケースでは、タプルへのポインタのみが格納され、及びタプルは別のブロックに格納されます。
これはまた、あなたがタプル自体を操作できることを意味します
let get_a (A x) = x (* error: The constructor A expects 2 argument(s),
but is applied here to 1 argument(s) *)
let get_b (B x) = x (* works *)