问题描述
在得到元组列表[("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)]
。