在OCaml中使用Map.update

Chr*_*s T 2 ocaml dictionary

我试图更改我在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)

我的语法或我的论点是不正确的?

Jac*_*ack 5

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

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.

  • 谢谢!我没有意识到 ```Map.add``` 更新了现有的 Map 条目! (2认同)