1

すべてのタイプを同時に保持できるリンク リストのデータ型、つまり void* 要素のリンク リストを作成しようとしています。設計では、レコードを保持するデータ型を作成しNodeます 。ValueNext

私がこれまでにやったことは -

datatype 'a anything = dummy of 'a ; (* suppose to hold any type (i.e void*) *)

datatype linkedList = Node of {Value:dummy, Next:linkedList}; (* Node contain this record *)

ご覧のとおり、上記の試みはうまくいきませんが、私の考えは十分に明確だと思います。それを機能させるには、ここでどのような変更が必要ですか?

4

2 に答える 2

4

レコード型の使用を強制されているかどうかはわかりません。それ以外の場合は、実行する方が簡単だと思うからです:

datatype 'a linkedlist = Empty | Cons of 'a * 'a linkedlist

次に、次のように使用できます。

val jedis = Cons ("Obi-wan", Cons("Luke", Cons("Yoda", Cons("Anakin", Empty))));

ここでのレコードの使用は悪い選択だと思います。そのアプローチで空のリストをどのように表現できるかさえ考えられません。

-編集-

複数のタイプのサポートに関するコメントに答えるには:

datatype polymorphic = N of int | S of string | B of bool
Cons(S("A"), Cons(N(5), Cons(N(6), Cons(B(true), Empty))));

状況によっては、代わりに SML リストを好む場合があります。

S("A")::N(5)::N(6)::B(true)::[];

リストを生成するもの

[S "A",N 5,N 6,B true]

つまり、同じ型 (つまり、多態的) のリストですが、この型は複数のコンストラクターを介してさまざまな種類のものを含めることができます。

于 2013-02-25T23:05:17.387 に答える
3

参考までに、ポリモーフィック リストの型を開いたままにしておくことが重要な場合は、SML の組み込み例外型 exn を使用できます。exn 型はオープンで、プログラムのどこにでも拡張できます。

exception INT of int
exception STR of string
val xs = [STR "A", INT 5, INT 6] : exn list

通常どおり、特定のタイプを選択的に大文字と小文字を区別できます。

val inc_ints = List.map (fn INT i => INT (i + 1) | other => other)

また、以前の定義について言及することなく、後で型を拡張できます。

exception BOOL of bool
val ys = [STR "A", INT 5, INT 6, BOOL true] : exn list

そこに任意の例外の構築を配置できることに注意してください (ここでは div-by-zero 例外):

val zs = Div :: ys : exn list

とは言っても、この (ab)use には良いユースケースはほとんどなく、上記の回答で Edwin が説明したように、一般的にクローズドサムタイプの方が適しています。

于 2013-02-26T12:01:37.497 に答える