1
显然以下两种类型是不同的,但为什么?Ocaml元组类型missunderstanding
type 'a llist = Nil | Cons of 'a * (unit -> 'a llist)
VS
type 'a llist = Nil | Cons of ('a * unit -> 'a llist)
不Cons
采取一个元组在这两种情况下的说法?
显然以下两种类型是不同的,但为什么?Ocaml元组类型missunderstanding
type 'a llist = Nil | Cons of 'a * (unit -> 'a llist)
VS
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 *)