2017-03-09 65 views
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采取一个元组在这两种情况下的说法?

回答

6

这是一个微妙的区别,但代表是不同的。可以看出在下面的例子:

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