Поиск значения в списке {key, value} в Erlang

Я новичок в Erlang, и, возможно, я просто пропустил эту проблему в учебнике, хотя это тривиально. Предположим, у меня есть список пар {Key, Value}, полученных из erlang:fun_info/1. Я хочу знать функцию arity, остальная часть списка меня не интересует. Поэтому я пишу что-то вроде:

find_value( _, [] ) ->
    nothing;
find_value( Key, [{Key, Value} | _] ) ->
    Value;
find_value( Key, [_ | T] ) ->
    find_value( Key, T).    

и затем выполните:

find_value( arity, erlang:fun_info( F )).

Я отлично работаю, но Должно ли что-то вроде find_value быть слишком распространенной процедурой для его написания? Однако я не смог найти его аналог в BIFs. Так вопрос: это хороший элегантный способ получить значение для ключа из списка кортежей {key, value}?

5 ответов


модуль proplists содержит get_value/2, который должен быть тем, что вы хотите.


lists:keyfind/3 это. Здесь я сопоставил его с вашим find_value/2 интерфейс:

find_value(Key, List) ->
    case lists:keyfind(Key, 1, List) of
        {Key, Result} -> Result;
        false -> nothing
    end.

proplists может быть, даже лучший маршрут.


поскольку списки: keyfind / 3 уже были опубликованы, я упомяну еще один полезный вариант, используя списки:

hd([ Value || {arity, Value} <- List ]).

это означает получение всех значений, так что каждый элемент является "значением" и происходит из кортежа, который соответствует {arity, Value} внутри списка. Поскольку понимание списка возвращает список, мы получаем главу этого списка.

и используя его в удовольствие:

1> List=[{a,1},{b,2},{c,3}].
[{a,1},{b,2},{c,3}]
2> F=fun(What, List) -> hd([ Value || {Key, Value} <- List, Key =:= What]) end.
#Fun<erl_eval.12.82930912>
3> F(c, List).
3

proplists: get_value - Это способ сделать это, если вы не заботитесь о скорости

списки:keyfind Это лучший выбор для производительности, так как это BIF. Вы можете wrapit с элемент/2 такой

element(2, lists:keyfind(K, 1, L))

и вы получите тот же результат proplists:get_value, но быстрее.

источник: http://www.ostinelli.net/erlang-listskeyfind-or-proplistsget_value/


find(K, [H|T]) ->
    case H of
        {K, V} -> V;
        _ -> find(K, T)
    end;
find(_, []) -> none.