2013-04-01 7 views
8

に簡素化した後、私はOCamlでは、この単純なコード持っている製品の種類を分解することができません:私はそれを簡素化OCamlの

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

、それ:

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

テスト私のextract機能を、動作するように表示されます

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

エラーが発生する:

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

面白いことに、私はちょうどそれらを分解することはできません...私はa' ...

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

の値を構築することができ、あります。どうして?

答えて

13

あなたは、これは、OCamlの型指定でのトリッキーな場所の一つです

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

を使用する必要があります。タイプone_field

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

intのペアだ単一のフィールドがあります:

微妙に異なっている関与する2つの種類があります。タイプtwo_fieldsには、それぞれがintである2つのフィールドがあります。複雑なことは、コンストラクタが同じに見えるということです。

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

これらの2つのタイプは区別され、実際にはメモリ内で異なって表現されています。 (実際には、2フィールドのバリアントはスペースが少なくて済み、アクセスするにはわずかに高速です。)