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

Bjorn Gustavsson bgustavsson@REDACTED
Wed Jan 21 14:37:35 CET 2009

```On Tue, Jan 20, 2009 at 4:15 PM, James Hague <james.hague@REDACTED> 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.
>

I have now done a prototype implementation of keyfind/3 as BIF.
I did on small change to the semantics. I implemented it to be equivalent
to

keyfind1(Key, N, [H|T]) when element(N, H) =:= Key -> H;
keyfind1(Key, N, [H|T]) -> keyfind1(Key, N, T);
keyfind1(Key, N, []) -> false.

rather than

keyfind2(Key, N, [H|T]) when element(N, H) == Key -> H;
keyfind2(Key, N, [H|T]) -> keyfind2(Key, N, T);
keyfind2(Key, N, []) -> false.

(keyfind1/3 uses '=:=', keyfind2/3 uses '==').

They give the same result in most cases expect when
integers is compared to floats as in:

3> t:keyfind1(42, 1, [{42.0,a}]).
false
4> t:keyfind2(42, 1, [{42.0,a}]).
{42.0,a}

I think that it was a historical accident that lists:keysearch/3 and
lists:keymember/3 use
'==' rather than '=:=' and that we should not repeat that mistake
lists:keyfind/3.

/Bjorn
--
Björn Gustavsson, Erlang/OTP, Ericsson AB

```