如何在 Ocaml 中解决这个字典问题?

Posted

技术标签:

【中文标题】如何在 Ocaml 中解决这个字典问题?【英文标题】:How could I solve this Dictionary problem in Ocaml? 【发布时间】:2020-10-31 17:05:30 【问题描述】:

给定元组列表[("x", 3); ("num", 17); ("y", 7); ("x", 5)] 创建一个字典,如果有相等的键,它们的值将被求和。所以在这个例子中,应该创建一个这样的字典 [("x", 8); ("num", 17); ("y", 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", 3); ("num", 17); ("y", 7); ("x", 5)];;
MS.bindings f1;;

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

【问题讨论】:

你在哪里尝试求和? MS.add(key, value) 插入(即添加)到字典中,它不会将多个值相加。当您插入一个已经在字典中的 key 时,它会被覆盖(因此您看到的结果)。 也许我没有把问题说得对; 我不知道如何求值的总和,所以我只是将它们添加到字典中。我怎样才能把总和? (TY) 使用+ 运算符,例如1 + 2. 【参考方案1】:

您正在寻找 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)]

【讨论】:

以上是关于如何在 Ocaml 中解决这个字典问题?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OCaml 中删除字符串的所有字符

如何在用户输入时中断 ocaml 程序

这个 ocaml 递归函数是如何工作的?

如何在 Ocaml 中使用多核进行蒙特卡罗模拟?

如何从 OCaml 中的字符串中去除空格?

在 ocaml 中定义树 + 指向其子树的指针