OCaml实现key-value列表合并union函数返回unit类型问题求助
问题原因
你的代码存在3个核心问题:
v1@v2;单独作为语句执行时返回值会被直接丢弃,你既没有将拼接结果存入要返回的键值对,也没有更新l2中对应key的value- 仅调用
List.hd l2取第二个列表的第一个元素对比,完全没有处理l2中剩余的其他键值对 - 整个递归过程没有累积构造结果列表,最终只会直接返回
l2,合并逻辑完全不生效
正确实现
你可以先把两个输入列表拼接后按键分组,再合并同key的value即可,实现代码如下:
type 'a kvs = (int * 'a list) list let union l1 l2 = (* 合并两个输入列表 *) let all_kv = l1 @ l2 in (* 递归分组合并同key的value *) let rec merge_group acc = function | [] -> acc | (k, v) :: rest -> match List.assoc_opt k acc with (* 新key直接加入累加器 *) | None -> merge_group ((k, v) :: acc) rest (* 已有key则合并value后更新累加器 *) | Some existing_v -> let updated_acc = List.remove_assoc k acc in merge_group ((k, existing_v @ v) :: updated_acc) rest in (* 按key升序排序,和示例输出顺序保持一致,不需要排序可直接返回merge_group [] all_kv *) List.sort (fun (k1, _) (k2, _) -> compare k1 k2) (merge_group [] all_kv)
测试验证
(* 示例输入测试 *) let l1 = [(1,["one"]);(1,["uno"])];; let l2 = [(2,["two"]);(1,["eden"])];; union l1 l2;; (* 输出:[(1, ["one"; "uno"; "eden"]); (2, ["two"])] 符合预期 *)
内容的提问来源于stack exchange,提问作者tacocat
相关产品推荐
相关产品推荐

