[erlang-questions] Merging maps with a fun like dict:merge/3
Ivan Uemlianin
ivan@REDACTED
Wed Aug 26 20:44:42 CEST 2015
Dear Alexander, Hynek
That is a *lot* faster! :D
Thanks very much both.
Ivan
On 08/26/15 10:38, Ivan Uemlianin wrote:
> 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>
>> 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>:
>>>
>>> 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
>>> @llaisdy
>>> llaisdy.wordpress.com <http://llaisdy.wordpress.com>
>>> github.com/llaisdy <http://github.com/llaisdy>
>>> 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
> ============================================================
>
>
> _______________________________________________
> erlang-questions mailing list
> 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/5fa62e66/attachment.htm>
More information about the erlang-questions
mailing list