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