3

smlで辞書を作成する必要がありますが、挿入機能に非常に苦労しています。

    type dict = string -> int option

例として、空の辞書を次に示します。

    val empty : dict = fn key => NONE

挿入関数の実装は次のとおりです。

    fun insert (key,value) d = fn d => fn key => value

しかし、これは間違ったタイプです。必要なのは挿入です:(string * int)->dict->dict。怠惰な関数から辞書の実装まで、あらゆるものを検索しました。どんな助けや指示も大歓迎です!

私が実装しようとしていることについてまだ混乱している場合は、単純なルックアップ関数を呼び出すときに何が得られるかを作成しました。

    fun lookup k d = d k

    - val d = insert ("foo",2) (insert ("bar",3) empty);
    val d = fn : string -> int option
    - lookup2 "foo" d;
    val it = SOME 2 : int option
    - lookup2 "bar" d;
    val it = SOME 3 : int option
    - lookup2 "baz" d;
    val it = NONE : int option
4

1 に答える 1

2

関数のシグニチャについて推論できます。

val insert = fn: (string * int) -> dict -> dict

と辞書を提供するkeyと、新しい辞書を取り戻したいと思います。は、なので、関数はaを取り、を返します。valuedd'dictstring -> int optiond'stringint option

その関数に文字列sを指定するとします。発生する可能性のある2つのケースがあります。関連付けられた値を返すのsと同じ場合、それ以外の場合はキーで検索して値を返します。keyds

これが直訳です:

fun insert (key, value) d = fn s => if s = key then SOME value
                                    else d s
于 2013-01-24T18:08:16.990 に答える