1

StandardMLでいくつかのデータ型を定義するとします。

datatype color = orange | navy | teal | silver | hsl of real * real * real;

datatype direction = east | north | west | south;

次に、上記のデータ型を使用する値を定義します。

type Cursor = int * int * color * direction;

val cursor : Cursor = (0, 0, orange, east);

位置、描画色、方向性を持った「カーソル」です。私がしたいのは、そのプロパティを最初は未定義にすることです。color次のように、それぞれとデータ型にコンストラクターを追加できます(位置の値directionを使用してこれを行うにはどうすればよいですか?)。int

datatype color = orange | teal | silver | hsl of real * real * real | undefined;

datatype direction = east | north | west | south | undefined;

val cursor : Cursor = (0, 0, undefined, undefined);

データ型ごとに追加のコンストラクターを明示的に定義することなく、これを実行したいと思います。undefinedあなたは良い、きれいな解決策を考えることができますか?タイプに関係なく、「未定義の値」の形式を単純に使用できるジェネリックの形式。大まかに言うと、Javaに類似してNullableいます。

私の動機は、カーソルのプロパティが最初は未定義であるということです。

4

2 に答える 2

3

この目的のために、人々は通常optionタイプを使用します。

結果のロボットタイプは次のようになります。

type Robot = (int * int * color * direction) option;

またはコンポーネントに関して。これは、2つのコンストラクター(1つは未定義の値を表し、もう1つは初期化された値を表す)を使用してデータ型を作成するのと同じですが、optionこれを行うための標準的な方法であり、モナディックプログラミングスタイルも促進します。

これにより、型の値を破棄するたびに両方のコンストラクターを一致させる必要があるため、型の安全性が得られます。

于 2012-10-29T17:02:11.297 に答える
3

同じ名前の異なるコンストラクターを参照できるようにするための構文上の糖衣はありません。(言い換えると、標準MLはカスタムのオーバーロードを許可しません。)代わりに、最初に宣言されたコンストラクターは、別のタイプの同様のスペルのコンストラクターによって上書きされます。

Haskellには、undefined評価されると例外をスローするという値があります。したがって、この値のタイプは特定のタイプに制限されず、多態性です。つまり、undefinedはどこでも使用できます。

標準MLは厳密に評価されるため、この値を例外スローのエイリアスとして定義することはできません。これは、その瞬間val undefined = raise Undefinedが宣言され、例外がスローされることを意味します。ただし、raise Undefinedすぐに評価されない限り、まだ作成されていないプログラムの一部で使用することは可能です。

代数型の非常に重要な強みは、それをサポートする型を明示的に形成しない限り(たとえば、を使用して)、誤ってnullのような値を持つことができないことです'a option

于 2012-10-30T18:08:56.253 に答える