Erlang-合并映射

Erlang-合并映射,erlang,maps,Erlang,Maps,我试图找出如何合并两个映射,以允许我处理具有相同键的元素 例如,合并 {“Ala”=>1,“kota”=>3} 与 {“kota”=>4} 应导致: {“Ala”=>1,“kota”=>7}Erlang中没有内置函数可以完全做到这一点,但可以使用maps:fold/3和maps:update\u/4这样做: 1> A = #{"Ala" => 1,"kota" => 3}. #{"Ala" => 1,"kota" => 3} 2> B = #{"kota" =

我试图找出如何合并两个
映射
,以允许我处理具有相同键的元素

例如,合并

{“Ala”=>1,“kota”=>3}

{“kota”=>4}

应导致:


{“Ala”=>1,“kota”=>7}

Erlang中没有内置函数可以完全做到这一点,但可以使用
maps:fold/3
maps:update\u/4
这样做:

1> A = #{"Ala" => 1,"kota" => 3}.
#{"Ala" => 1,"kota" => 3}
2> B = #{"kota" => 4}.
#{"kota" => 4}
3> maps:fold(fun(K, V, Map) -> maps:update_with(K, fun(X) -> X + V end, V, Map) end, A, B).
#{"Ala" => 1,"kota" => 7}

代码基本上是这样做的:对于B中的每个项,如果A中存在相同的键,它将获取值(V)并添加当前值(X)。如果不存在,则将值设置为
V

此函数将合并两个贴图,并在两个贴图中都存在该键的情况下运行函数(Fun)。它还处理了Map1大于Map2的情况,反之亦然

map_merge(Map1, Map2, Fun) ->
    Size1 = maps:size(Map1),
    Size2 = maps:size(Map2),
    if
        Size1 > Size2 ->
            Folder = fun(K, V1, Map) ->
                maps:update_with(K, fun(V2) -> Fun(K, V1, V2) end, V1, Map)
            end,
            maps:fold(Folder, Map1, Map2);
        true ->
            Folder = fun(K, V1, Map) ->
                maps:update_with(K, fun(V2) -> Fun(K, V2, V1) end, V1, Map)
            end,
            maps:fold(Folder, Map2, Map1)
    end.
erl shell中的示例用法:

1> my_module:map_merge(#{"a" => 10, "b" => 2}, #{"a" => 1}, fun(K, V1, V2) -> V1 + V2 end).
#{"a" => 11,"b" => 2}
2> my_module:map_merge(#{"a" => 10}, #{"a" => 1, "b" => 2}, fun(K, V1, V2) -> V1 + V2 end).
#{"a" => 11,"b" => 2}
3> my_module:map_merge(#{"a" => 10},#{"a" => 10}, fun(K, V1, V2) -> V1 + V2 end).
#{"a" => 20}

这很奇怪,但是我得到了这个错误
maps:fold(fun(K,V,Map)->maps:update_with(K,fun(X)->X+V end,V,Map)end,A,B.**异常错误:未定义的函数映射:在函数列表中使用/4更新\u:foldl/3(lists.erl,第1262行)
您是否在Erlang 18或更旧版本上?此函数是在Erlang 19中添加的:。