Ocaml元组类型错误理解

Ocaml元组类型错误理解,ocaml,Ocaml,显然,下面的两种类型不同,但为什么呢 type 'a llist = Nil | Cons of 'a * (unit -> 'a llist) vs 在这两种情况下,Cons不是都将元组作为参数吗?这是一个细微的区别,但表示方式不同。可以在以下示例中看到: type ta = A of int * int type tb = B of (int * int) A是具有两个参数的构造函数,B是具有单个元组参数的构造函数 通过在运行时检查对象的大小,可以看到差异: let size x

显然,下面的两种类型不同,但为什么呢

type 'a llist = Nil | Cons of 'a * (unit -> 'a llist)
vs


在这两种情况下,
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 *)
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 *)