2017-03-09 1 views
1

분명히 아래의 2 가지 유형이 다르지만 그 이유는 무엇입니까?Ocaml 튜플 유형의 미스가

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

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

이 또한 튜플 자체를 조작 할 수 있다는 것을 의미한다