2

我正在阅读这篇关于堆栈溢出的文章

如何在 OCaml 中将字典实现为函数?

我认为问题陈述是使用闭包创建一个字典对象。

但是我发现关闭非常难以理解。

我面临的问题是

根据我上面发布的线程的答案,我在 OCAML REPL 中输入了以下代码

let empty (_ : string) : int = 0;;
let add d k v = fun k' -> if k = k' then v else d k;;
let d = add empty "foo" 10;;
let d1 = add d "bar" 20;;

现在如果我这样做

d1 "foo"

它返回 0。

但这是错误的!我已经从 d 构建了 d1。因此必须在字典中找到“foo”和“bar”。

如果我使用非封闭方法实现了这本字典,那么搜索我的列表会非常容易,当然会找到“foo”和“bar”。

我在这里想念什么?

4

1 回答 1

5

您的添加不正确。如果一个闭包未能找到给定的密钥 k',它必须向底层闭包询问相同的 k',而不是 k。

正确答案是:

let add d new_k new_v = fun query_k -> if new_k = query_k then v else d query_k

有时冗长的参数名称可能有助于避免这种错误。

于 2013-09-12T05:30:00.530 回答