我正在尝试更改我在 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/