ocaml - 了解 ocaml 中的基本闭包示例

标签 ocaml

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

How to implement a dictionary as a function in 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”。

我在这里错过了什么?

最佳答案

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

正确答案是:

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

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

关于ocaml - 了解 ocaml 中的基本闭包示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18755671/

相关文章:

ocaml - ocamldebug 的 REPL?

haskell - SystemT 编译器和处理 Haskell 中的无限类型

arrays - OCaml 中的数组操作

class - 如何将迭代器关联到 OCaml 中的集合

regex - 检查字符串是否以 OCaml 中的某些文本结尾的最方便方法?

image-processing - 如何在 OCAML 中读取位图?

docker - 为什么我无法获得ocaml/opam:ubuntu-16.04_ocaml-4.03.0 docker镜像?

pattern-matching - Ocaml 中使用 try/with 语句进行类型检查?

ocaml - 在 OCaml 中放置括号的一般规则是什么?

ocamlfind:在 ubuntu 17.04 上找不到包 `lablgtk2.gnomecanvas'