[erlang-questions] lists:keyfind as an alternative to lists:keysearch

Mikael Pettersson <>
Tue Jan 20 17:11:33 CET 2009


James Hague writes:
 > I proposed this several years ago, but now that there seems to be
 > quite a bit of momentum for improving the language and implementation,
 > I'm revising it.  It's a library tweak, so no formal EEP.  If anyone
 > wants a real EEP, let me know.
 > 
 > lists:keysearch/3 is used for searching a list of tuples.  It returns
 > two possible values:
 > 
 > * 'false' if a tuple containing the desired key is not found
 > * {value, Tuple} if a tuple is found.
 > 
 > Wrapping the result in a tagged tuple is not needed.  It causes
 > pointless memory allocation and code to check the result.  In fact,
 > it's more efficient to check for this pattern:
 > 
 >    {_, Tuple}
 > 
 > than to include the "value" atom.
 > 
 > I would like to propose the addition of lists:keyfind/3, which is
 > identical in structure to lists:keysearch/3, except that it returns
 > either 'false' or the found tuple, with no additional wrapping of the
 > result.  This can be trivially added to the lists module:
 > 
 >    keyfind(K, N, L) ->
 >       case keysearch(K, N, L) of
 >          {_, Tuple} -> Tuple;
 >          X -> X
 >       end.
 > 
 > But ideally it would be a BIF (like lists:keysearch) to avoid
 > construction of the tagged tuple.  At the moment, association lists
 > and the "key" functions are one of the best alternatives to
 > lightweight dictionaries.  With this proposed change, they'd be even
 > lighter weight and simpler to use.

I totally agree with this suggestion.



More information about the erlang-questions mailing list