我试图更改我在OCaml中制作的地图中的键的值:
module TestMap = Map.Make(String);;
let m = TestMap.empty;;
let m = TestMap.add "Chris" 1 m ;;
let m = TestMap.add "Julie" 4 m;;
Run Code Online (Sandbox Code Playgroud)
这会编译文件,但是当我尝试使用以下命令更新key的值时Julie
:
let m = TestMap.update "Julie" 10 m;;
Run Code Online (Sandbox Code Playgroud)
我从编译器得到一个错误:
Error: This expression has type int but an expression was expected of type
'a option -> 'a option
Run Code Online (Sandbox Code Playgroud)
我猜我可能错误地使用了这个功能.我发现Map.update的文档很难理解:
val update : key -> ('a option -> 'a option) -> 'a t -> 'a t
Run Code Online (Sandbox Code Playgroud)
我的语法或我的论点是不正确的?
更新功能的工作方式与您的想法不同
key -> ('a option -> 'a option) -> 'a t -> 'a t
Run Code Online (Sandbox Code Playgroud)
你看到第二个参数是一个函数,它接受一个'a option
并返回一个'a option
所以你不用新值直接更新,而是传递一个返回新值的函数,根据前一个,例如:
let m = TestMap.update "Julie" (fun _ -> Some 10) m;;
Run Code Online (Sandbox Code Playgroud)
这是因为,正如文档所述,传递'a option
告诉您是否存在键的映射,并且返回'a option
允许您更改它甚至删除它(通过None
).
如果您只需要更新可以Map.add
再次使用的映射,则无需使用更高级的映射Map.update
.