dictionary - 在 OCaml 中使用 Map.update

标签 dictionary ocaml

我正在尝试更改我在 OCaml 中制作的 map 中的键值:

module TestMap = Map.Make(String);;
let m = TestMap.empty;;
let m = TestMap.add "Chris" 1 m ;;
let m = TestMap.add "Julie" 4 m;;

这会编译文件,但是当我尝试更新键 Julie 处的值时和:
let m = TestMap.update "Julie" 10 m;;

我从编译器收到一个错误:
Error: This expression has type int but an expression was expected of type
         'a option -> 'a option

我猜我可能错误地使用了该功能。我发现 Map.update 的文档很难理解:
val update : key -> ('a option -> 'a option) -> 'a t -> 'a t

是我的语法还是我的参数不正确?

最佳答案

更新功能的工作方式与您的想法不同

key -> ('a option -> 'a option) -> 'a t -> 'a t

你会看到第二个参数是一个接受 'a option 的函数。并返回 'a option所以你不直接用新值更新,而是根据前一个传递一个返回新值的函数,例如:
let m = TestMap.update "Julie" (fun _ -> Some 10) m;;

这是因为,正如文档所述,通过的 'a option告诉您是否存在键和返回的 'a option 的映射。允许您更改它甚至删除它(通过 None )。

如果您只需要更新映射,您可以使用 Map.add同样,没有必要使用更高级的 Map.update .

关于dictionary - 在 OCaml 中使用 Map.update,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52528430/

相关文章:

python - 通过DictReader读取.csv

dictionary - 映射接受单数或集合

ocaml - uint16_t 和 uint8_t 的等价物是什么

java - OCaml:两组中每个值的排列? (如何从 Java 翻译这个)

javascript - 根据项目被调用的次数映射集合

java - 如何在 JSP 上将 Map 的键放入 <select> 中

c++ - 初始化 1000 个 map 元素

f# - OCaml 函数少传入一个参数

functional-programming - 将模块及其实例作为 OCaml 函数的参数

types - 为什么这个 OCaml 仿函数无法识别结构类型?