1

私は現在SMLを学んでいますが、名前のないものについて質問があります。今のところ「タイプエイリアス」と呼びましょう。次のデータ型の定義があるとします。

datatype 'a stack = Stack of 'a list;

ここで、明示的な「空のスタック」タイプを追加したいと思います。これをデータ型に追加することで可能になります。

datatype 'a stack = emptystack | Stack of 'a list;

これで、「プッシュ」のような関数をパターンマッチングできます。

fun push (emptystack) (e:'a) = Stack([e])
  | push (Stack(list):'a stack) (e:'a) = Stack(e::list);

ここでの問題は、Stack([])emptystackが異なるということですが、私はそれらを同じにしたいのです。したがって、SMLが検出されるたびに、Stack([])これが「認識」されている必要がありますemptystack(プッシュの場合は、空のスタックの一致を使用する必要があります)。

これを達成する方法はありますか?

4

3 に答える 3

2

このようなエイリアシングはSMLでは不可能です。

代わりに、必要に応じて、表現が明確になるようにデータ型を設計する必要があります。

あなたはおそらく、'a listmoreの定義に似たものに適しているでしょう:

datatype 'a stack = EmptyStack | Stack of 'a * 'a stack;

これには、リスト関数を使用できないという欠点がありますが、明示的な空のスタックコンストラクターを取得します。

于 2012-05-04T11:43:21.090 に答える
2

簡単な答えは:いいえ、それは不可能です。

コードを使用してタイプエイリアスを作成できます

type number = int

val foo : number -> int -> number =
 fn a => fn b => a+b

val x : int = foo 1 3;
val y : number = foo 1 3;

ただし、その名前が示すように、タイプに対してのみ機能します。あなたの質問は、構文がない値コンストラクターに行きます。

于 2012-05-04T11:47:47.263 に答える
0

ある値emptystackが別の値と同義であるStack []ことが必要なため、探しているものを「値のエイリアス」と呼ぶことができます。=組み込みの演算子またはパターンマッチングと比較される値は、エイリアスを許可しません。

=これは、独自の等式演算子を作成することで実現できますが、組み込み(Standard MLはカスタム演算子のオーバーロードをサポートしていないため)を使用する機能と、タイプの値コンストラクターでパターンマッチングを行う機能が失われます。

または、タイプの正規形を作成して、常に正規形を比較することもできます。実際に実行可能な場合は常に、あいまいさのないというセバスチャンの提案に従ってください。明確な代数型は、同じ値をさまざまな方法で表現できる単純な型よりもはるかに複雑になる場合があります。

于 2012-05-04T12:58:20.367 に答える