理解ocaml中的基本Closure示例

时间:2013-09-12 04:58:57

标签: ocaml

我正在阅读有关堆栈溢出的文章

How to implement a dictionary as a function in OCaml?

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

然而,我发现关闭非常难以理解。

我面临的问题是

根据我上面发布的帖子的答案,我在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”。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

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

正确答案是:

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

有时,详细的参数名称可能有助于避免这种错误。