2013-04-01 12 views
8

Ich habe diesen einfachen Code in OCaml dekonstruieren:Unable Produktart nach Vereinfachung in OCaml

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

Testen meiner extract Funktion scheint es zu funktionieren:

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

ich es vereinfachen, so dass es braucht nur eine Art:

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

Aber ich bekomme die Fehlermeldung:

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

Das Komische ist, kann ich Werte von a' konstruieren ...

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

... Ich kann sie einfach nicht dekonstruieren. Warum?

Antwort

13

Sie benötigen

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

Dies ist eine der kniffligen Stellen in OCaml Typangabe zu verwenden.

Es gibt zwei verschiedene Arten beteiligt, die auf subtile Weise anders sind:

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

Im Typ one_field gibt es ein einzelnes Feld, das ein Paar von ints ist. Im Typ two_fields gibt es zwei Felder, von denen jedes ein int ist. Die heikle Sache ist, dass der Konstruktor sieht identisch:

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

Diese beiden Typen unterscheiden sich und sind in der Tat anders dargestellt in Erinnerung. (Die Zwei-Feld-Variante benötigt tatsächlich weniger Platz und ist etwas schneller zugänglich.)