如何在Ocaml中解决此Dictionary问题?

问题描述

在得到元组列表[("x",3); ("num",17); ("y",7); ("x",5)]之后,创建一个字典,如果有相等的键,则将它们的值相加。因此,在此示例中,应创建这样的字典 [("x",8); ("num",7)];与字典的顺序无关。

这是我尝试的代码

module MS = Map.Make(String);;
let f l = List.fold_left (fun acc (key,value) -> MS.add key value acc) MS.empty l;;
let f1 = f [("x",5)];;
MS.bindings f1;;

但是它会不断覆盖相同键的值(输出[("num",17); ("x",5); ("y",7)]

解决方法

您要查找Map的update函数,而不是add

module MS = Map.Make(String)

let f l =
  List.fold_left
    (fun acc (key,value) ->
         MS.update key (function Some v -> Some (value + v) | None -> Some value) acc)
     MS.empty l

let f1 = f [("x",3); ("num",17); ("y",7); ("x",5)]

对于此版本,MS.bindings f1将返回[("num",17); ("x",8); ("y",7)]