2013-04-01 9 views
8

Mam ten prosty kod w SML:Nie dekonstrukcji rodzaj produktu po uproszczeniu w SML

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

Testowanie mój extract funkcji, wydaje się działać:

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

I uprościć go, więc potrzebuje tylko jednego typu:

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

Ale pojawia się błąd:

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

Najśmieszniejsze jest to, mogę skonstruowania wartości a' ...

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

... po prostu nie mogę ich dekonstrukcji. Czemu?

Odpowiedz

13

Trzeba użyć

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

Jest to jedna z trudnych miejsc w specyfikacji typu OCaml.

Istnieją dwa różne rodzaje zaangażowane, które są nieco inne:

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

W typie one_field istnieje pojedyncze pole to parę wskazówki. W typie two_fields znajdują się dwa pola, z których każdy jest int. Trudne jest to, że konstruktor wygląda identycznie:

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

Te dwa typy są różne i są w rzeczywistości inaczej reprezentowane w pamięci. (Wariant z dwoma polami faktycznie zajmuje mniej miejsca i jest nieco szybszy do uzyskania.)