3

私はunionOCamlを少し学んでいて、かなり混乱しました。


Cでは、ユニオンは次のようになります

union {
    int i;
    float f;
} x;
x.i = 0x27;
printf ("%f\n", x.f);

では、OCaml のユニオンは同じ目的を果たしますか?

例を見てみましょう。以下は共用体の定義です。

ここに画像の説明を入力

上記の C の例のように、この共用体を使用するにはどうすればよいですか?


この方にも

ここに画像の説明を入力

type 'a set組合の定義ですか?どうtype 'a set = 'a listですか?なぜ?

4

1 に答える 1

8

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 は間違ったフィールドにアクセスする可能性を排除します。パターン マッチングによってのみ値にアクセスできるため、常に正しい型を持っていることがわかります。

型の値に対するパターン マッチングは、numberOCaml では次のようになります。

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は決して定義ではありません。インターフェイスを指定するだけです。このインターフェイスの実装では、set1 つの型パラメーターを取る名前付きの型を定義する必要があります。

type 'a set = 'a listは定義ですが、差別された組合ではありません。これは単なる型エイリアスです。つまり、"'a setは ' の単なる別の名前です'a list。判別共用体の定義では、等号の後の最初のものとしてコンストラクターがあります。コンストラクターは常に大文字で始まります。

于 2013-01-09T18:25:05.667 に答える