我正在编写一个OCaml函数,我需要合并两个映射.我无法弄清楚mergefunctor提供的函数的语义Map.Make(在OCaml的3.12.0版本中找到).有人可以向我提供比OCaml手册更详细的解释吗?一个例子可能足以让我弄清楚.
另外,我需要合并的两个映射有一些有趣的属性:键具有相同的类型(int实际上),并且它们的域是不相交的.是否有比合并例程更有效的方法?
sep*_*p2k 11
merge需要一个函数和两个映射.对于任一映射中存在的每个键,将调用该函数.如果密钥仅出现在其中一个映射中,则另一个映射的值将作为None传递(这就是参数为选项的原因).如果函数返回Some x,则新映射将具有x相关键的值.否则密钥将不存在.
例:
let map1 = add 1 2 (add 2 3 empty);;
let map2 = add 2 5 (add 3 4 empty);;
let map3 = merge (fun k xo yo -> match xo,yo with
| Some x, Some y -> Some (x+y)
| _ -> None
) map1 map2;;
Run Code Online (Sandbox Code Playgroud)
map3现在包含映射2 -> 8.
如果您将其更改为:
let map3 = merge (fun k xo yo -> match xo,yo with
| Some x, Some y -> Some (x+y)
| None, yo -> yo
| xo, None -> xo
) map1 map2;;
Run Code Online (Sandbox Code Playgroud)
它将包含映射1 -> 2,2 -> 8和3 -> 4.