2013-04-01 20 views
8

yılında basitleştirilmesi sonra ürün tipini yapısızlaştırmak açılamıyor:Ben OCaml içinde bu basit kodu var OCaml

type int_pair = int * int;; 
type a = A of int_pair;; 
let extract (A x) = x;; 

benim extract fonksiyonunu test, işe görünmektedir: Bunu basitleştirmek

# extract (A (1,2));; 
- : int_pair = (1, 2) 

, bu yüzden sadece bir tür gerekir:

type a' = A' of int * int;; 
let extract' (A' x) = x;; 

Ama hatayı alıyorum:

komik bir şey
Error: The constructor A' expects 2 argument(s), 
     but is applied here to 1 argument(s) 

, ben

# A' (1,2);; 
- : a' = A' (1, 2) 

... Sadece onları Deconstruct edemez ... a' değerlerini oluşturabilirsiniz. Niye ya?

cevap

13

Sen

type a' = A' of (int * int) 

Bu OCaml tip şartnamede zor yerlerden biridir kullanmak gerekir. tip one_field yılında

type one_field = F1 of (int * int) 
type two_fields = F2 of int * int 

ints bir çift olan tek alan var:

kurnazca farklıdır karışan iki farklı tipi vardır. two_fields türünde her biri int olan iki alan vardır. zor olan yapıcı özdeş olan bir:

# F1 (3, 5);; 
- : one_field = F1 (3, 5) 
# F2 (3, 5);; 
- : two_fields = F2 (3, 5) 

Bu iki tip farklı olan ve aslında bellekte farklı temsil edilmektedir. (İki alan varyantı aslında daha az yer kaplar ve erişmek için biraz daha hızlıdır.)