[erlang-questions] Merging maps with a fun like dict:merge/3

Ivan Uemlianin ivan@REDACTED
Wed Aug 26 11:38:59 CEST 2015


Oh yes of course that's better.  Thanks

Ivan


On 26/08/2015 10:32, Hynek Vychodil wrote:
> I would consider:
>
> merge_ap(F, [Head | Tail]) ->
>     lists:foldl(fun(Y, X) ->
>                         maps:merge(X, maps:map(fun(Key, Value) ->
>                                                        case 
> maps:find(Key, X) of
>  {ok, V} -> F(Key, V, Value);
>  error    -> Value
>                                                        end
>                                                end,
>                                                Y))
>                 end,
>                 Head,
>                 Tail).
>
> On Wed, Aug 26, 2015 at 10:45 AM, Ivan Uemlianin <ivan@REDACTED 
> <mailto:ivan@REDACTED>> wrote:
>
>     Dear Alexander
>
>     Thanks!  That looks excellent!
>
>     I notice that your function F is different from the dict:merge/3
>     function: instead of taking a key and the two values, is takes two
>     values, defaulting the first to 0.
>
>     I've put my case clause into your framework:
>
>     merge_ap(F, [Head | Tail]) ->
>         lists:foldl(fun(Y, X) ->
>     maps:merge(X, maps:map(fun(Key, Value) ->
>     case maps:is_key(Key, X) of
>     false ->
>     Value;
>     true ->
>     F(Key, Value, maps:get(Key, X))
>     end
>                                                    end,
>                                                    Y))
>                     end,
>                     Head,
>                     Tail).
>
>     This has desired behaviour, and will probably still perform well. 
>     Using lists:foldl is a brilliant idea.
>
>     Best wishes
>
>     Ivan
>
>
>
>     On 26/08/2015 09:16, Alexander Petrovsky wrote:
>>     Hi!
>>
>>     I've make some little benchmarks, and noticed that the most
>>     effective way is:
>>
>>     merge(F, [Head | Tail]) ->
>>         lists:foldl(fun(Y, X) -> maps:merge(X, maps:map(fun(Key,
>>     Value) -> F(maps:get(Key, X, 0), Value) end, Y)) end, Head, Tail).
>>
>>
>>     2015-08-23 20:05 GMT+03:00 Ivan Uemlianin <ivan@REDACTED
>>     <mailto:ivan@REDACTED>>:
>>
>>         Dear All
>>
>>         The maps module does not have a merge/3 like dict:merge/3,
>>         which calls a function fun(Key, Val1, Val2) when both dicts
>>         have the same key.  From the documentation, "If a key occurs
>>         in both dictionaries then Fun is called with the key and both
>>         values to return a new value."
>>
>>         The dict documentation says that dict:merge/3 is faster than
>>         an equivalent implemented in erlang.
>>
>>         http://www.erlang.org/doc/man/dict.html#merge-3
>>
>>         Why does the maps module not have a similar merge/3?  Is it
>>         because writing our own erlang implementation is at fast as
>>         it gets?
>>
>>         Below is an implementation which seems to work.  Can it be
>>         made faster?
>>
>>
>>         merge_maps(Fun, M1, M2) ->
>>         maps:fold(fun(K, V1, Acc) ->
>>                               case maps:is_key(K, Acc) of
>>                                   false ->
>>         maps:put(K, V1, Acc);
>>                                   true ->
>>                                       V2 = maps:get(K, Acc),
>>         maps:put(K, Fun(K, V1, V2), Acc)
>>                               end
>>                       end,
>>                       M1,
>>                       M2).
>>
>>         merge_maps_test() ->
>>             merge_maps(fun(_K, V1, V2) -> V1 + V2 end,
>>                        #{a => 1, b => 2, c => 3},
>>                        #{b => 2, c => 3, d => 4}) =:=
>>                 #{a => 1, b => 4, c => 6, d => 4}.
>>
>>
>>         With thanks and best wishes
>>
>>         Ivan
>>
>>         -- 
>>         ============================================================
>>         Ivan A. Uemlianin PhD
>>         Llaisdy
>>         Speech Technology Research and Development
>>
>>         ivan@REDACTED <mailto:ivan@REDACTED>
>>                                 @llaisdy
>>         llaisdy.wordpress.com <http://llaisdy.wordpress.com>
>>         github.com/llaisdy <http://github.com/llaisdy>
>>         www.linkedin.com/in/ivanuemlianin
>>         <http://www.linkedin.com/in/ivanuemlianin>
>>
>>                                 festina lente
>>         ============================================================
>>
>>         _______________________________________________
>>         erlang-questions mailing list
>>         erlang-questions@REDACTED <mailto:erlang-questions@REDACTED>
>>         http://erlang.org/mailman/listinfo/erlang-questions
>>
>>
>>
>>
>>     -- 
>>     Петровский Александр / Alexander Petrovsky,
>>
>>     Skype: askjuise
>>     Phone: +7 914 8 820 815
>>
>
>     -- 
>     ============================================================
>     Ivan A. Uemlianin PhD
>     Llaisdy
>     Speech Technology Research and Development
>
>                          ivan@REDACTED <mailto:ivan@REDACTED>
>                              @llaisdy
>                               llaisdy.wordpress.com <http://llaisdy.wordpress.com>
>                    github.com/llaisdy <http://github.com/llaisdy>
>                           www.linkedin.com/in/ivanuemlianin
>     <http://www.linkedin.com/in/ivanuemlianin>
>
>                              festina lente
>     ============================================================
>
>
>     _______________________________________________
>     erlang-questions mailing list
>     erlang-questions@REDACTED <mailto:erlang-questions@REDACTED>
>     http://erlang.org/mailman/listinfo/erlang-questions
>
>

-- 
============================================================
Ivan A. Uemlianin PhD
Llaisdy
Speech Technology Research and Development

                     ivan@REDACTED
                         @llaisdy
                          llaisdy.wordpress.com
               github.com/llaisdy
                      www.linkedin.com/in/ivanuemlianin

                         festina lente
============================================================

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20150826/ff9b0e59/attachment.htm>


More information about the erlang-questions mailing list