[erlang-questions] analogue of lists:keyfind and other lists:key*** functions for lists which contain maps

Loïc Hoguin <>
Sun Nov 23 21:45:47 CET 2014


On 11/23/2014 10:32 PM, John Doe wrote:
> There are 12 lists:key*** functions at the moment and it looks like it
> makes sense to replicate all of them as lists:map*** ones. The edge
> error cases will be "what to do when a map does not contain the key?".
> In this case lists:key*** behave differently in different functions -
> lists:keymap throws and exception when list contains a single non-tuple,
> lists:keydelete allows such lists.

keysearch and keytake should probably not be considered as they're 
basically duplicating functionality in other functions (and should be 
deprecated and removed from OTP at some point in the far future in my 
opinion).

> 2014-11-23 17:43 GMT+03:00 Lukas Larsson <
> <mailto:>>:
>
>     Hello,
>
>     I agree with you that in certain situations they would be very
>     convenient. I've myself already written these functions in a couple
>     of modules.
>
>     How do you imagine the semantics would work? It is fairly straight
>     forward when the list only contains maps or tuples.
>
>     lists:keyfind(you, name, [#{ name => me, from => here }, #{ name =>
>     you, from => there}]) returns #{ name => you, from => there}.
>
>     But if we start to mix them some interesting corner cases pop up:
>
>     lists:keyfind(2, 1,[#{ 2 => 3 },{2, 4},#{ 1 => 2 } ]) returns {2,4}
>     or #{ 1 => 2 }?
>     lists:keyfind(1, id, [{1,2}, #{ id => 2}, #{ id => 1}) returns #{ id
>     => 1 } or crashes as id is not a valid key for {1,2}?
>
>     Or error cases of today:
>
>     lists:keyfind(2, id, []) today gives badarg, but should return false
>     for a map list?
>
>     The safest way to introduce these functions would be to create new
>     ones called something like lists:mkeyfind, but if possible it would
>     be very neat to use the same API. It really is unfortunate that
>     lists:keyfind is so forgiving today, you can mix and match whatever
>     you want in the list and keyfind will quietly ignore it.
>
>     Also we have to consider which of the lists:key* functions we want a
>     map counterpart? Does it make sense for all of them?
>
>     Thoughts? Ideas? Suggestions?
>
>     Lukas
>
>
>     On Sat, Nov 22, 2014 at 7:33 PM, John Doe <
>     <mailto:>> wrote:
>
>         It would be nice to extend lists module with a set of optimized
>         functions like lists:key*** for lists containing maps.
>
>         _______________________________________________
>         erlang-questions mailing list
>          <mailto:>
>         http://erlang.org/mailman/listinfo/erlang-questions
>
>
>
>
>
> _______________________________________________
> erlang-questions mailing list
> 
> http://erlang.org/mailman/listinfo/erlang-questions
>

-- 
Loïc Hoguin
http://ninenines.eu


More information about the erlang-questions mailing list