Ocaml元组类型的误解

时间:2017-03-09 08:53:16

标签: ocaml

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

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

VS

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

在这两种情况下,没有Cons将元组作为参数吗?

1 个答案:

答案 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 *)