8

私は OCaml にこの単純なコードを持っています:

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

extract私の機能をテストすると、うまくいくようです:

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

単純化して、必要なタイプは 1 つだけです。

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)

...私はそれらを解体することはできません。なんで?

4

1 に答える 1

14

使用する必要があります

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

これは、OCaml 型仕様のトリッキーな場所の 1 つです。

微妙に異なる 2 つの異なるタイプが関係しています。

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

one_fieldには、int のペアである単一のフィールドがあります。タイプtwo_fieldsには、それぞれが int である 2 つのフィールドがあります。注意が必要なのは、コンストラクターが同じに見えることです。

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

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

于 2013-04-01T22:14:09.900 に答える