OCaml の判別共用体は、列挙型と組み合わせた C 共用体のようなものです。したがって、number
型の例は、C では次のように表すことができます。
enum number_tag {
ZERO, INTEGER, REAL
};
union number_value {
int i; /* Only access this if tag is INTEGER */
float f; /* Only access this if tag is REAL */
};
struct number {
enum number_tag tag;
union number_value value;
};
そのため、列挙型にアクセスして数値の型を確認し、列挙型の値に基づいて共用体の適切なフィールドにアクセスできます。もちろん、C は共用体の間違ったフィールドへのアクセスをやめません。
一方、OCaml は間違ったフィールドにアクセスする可能性を排除します。パターン マッチングによってのみ値にアクセスできるため、常に正しい型を持っていることがわかります。
型の値に対するパターン マッチングは、number
OCaml では次のようになります。
match value_of_type_number with
| Zero ->
(* Handle the case that the number is Zero *)
| Integer i ->
(* Handle the case that the number is an Integer with the value i *)
| Float f ->
(* Handle the case that the number is a Float with the value f *)
これに相当するものは次のとおりです。
switch(value_of_type_number.tag) {
case ZERO:
/* Handle the case that the number is Zero */
break;
case INTEGER:
int i = value_of_type_number.value.i;
/* Handle the case that the number is an Integer with the value i */
break;
case FLOAT:
float f = value_of_type_number.value.f;
/* Handle the case that the number is a Float with the value f */
break;
}
type 'a set
組合の定義ですか?どうtype 'a set = 'a list
ですか?なぜ?
type 'a set
は決して定義ではありません。インターフェイスを指定するだけです。このインターフェイスの実装では、set
1 つの型パラメーターを取る名前付きの型を定義する必要があります。
type 'a set = 'a list
は定義ですが、差別された組合ではありません。これは単なる型エイリアスです。つまり、"'a set
は ' の単なる別の名前です'a list
。判別共用体の定義では、等号の後の最初のものとしてコンストラクターがあります。コンストラクターは常に大文字で始まります。