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

当你提供keyvalue一本字典d时,你想取回一本新字典d'。因为dictis string -> int option, d'is 函数接受 astring并返回 a int option

假设您s为该函数提供了一个字符串。有两种情况可能发生:whenskey您返回关联的值相同,否则您通过查找dkey来返回一个值s

这是一个字面翻译:

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