显然下面两种类型不同,但为什么呢?
type 'a llist = Nil | Cons of 'a * (unit -> 'a llist)
VS
type 'a llist = Nil | Cons of ('a * unit -> 'a llist)
在这两种情况下,没有Cons
将元组作为参数吗?
答案 0 :(得分:10)
这是一个微妙的差异,但代表性是不同的。可以在以下示例中看到:
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 *)