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

Mikael Pettersson <>
Wed Jan 21 11:50:32 CET 2009


Richard Carlsson writes:
 > Bjorn Gustavsson wrote:
 > > On Tue, Jan 20, 2009 at 4:15 PM, James Hague <> wrote:
 > >> 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.
 > >>
 > > 
 > > Good idea.
 > > 
 > > Unless someone has any good reasons agains this suggestion, we will probably
 > > implement it in R13. (lists:keyfind/3 will be a BIF, and
 > > lists:keysearch/3 implemented
 > > in Erlang.)
 > 
 > Only that I always wince at the mixing of 'false' with {...}. Since this
 > is a new function, I'd prefer 'error' (to pick another atom that is
 > frequently used in Erlang libraries).

Except that it's not actually an error to ask "search list L
for a tuple T with value K in element N and return T, or tell
me if none could be found". So I'd argue that 'false' is much
more appropriate than 'error'.

At least, _I_ don't want that to be an error, since that would
require silly coding like:
1. ask if the element is there, but don't return it (query, boolean)
2. if it's there, get it (lookup, throws exn on failure not never here)
when what one often wants is:
1. if the element is there, return it, otherwise return 'no'



More information about the erlang-questions mailing list