8

I'm new to Erlang and maybe I just missed this issue in the tutorial though it is trivial. Let's say, I have a list of {Key, Value} pairs gotten from erlang:fun_info/1. I want to know function arity, the rest of the list is no interest to me. So I write something like:

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

And then do:

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

I works fine, but should something like find_value be a too common routine to write it? I failed to find its' analogue in BIFs though. So the question is: it there a nice elegant way to get a value for a key from a list of {key, value} tuples?

4

5 に答える 5

12

モジュールには、必要なものがproplists含まれています。get_value/2

于 2012-06-03T12:15:48.013 に答える
10

lists:keyfind/3これを行います。ここで私はそれをあなたのfind_value/2インターフェースにマッピングしました:

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

ただし、プロップリストはさらに良いルートかもしれません。

于 2012-06-03T12:27:16.260 に答える
4

lists: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
于 2012-06-03T14:13:03.433 に答える
2

proplists:get_valueは、速度を気にしない場合の方法です

lists:keyfindは BIF であるため、パフォーマンスに最適です。このように要素/2でラップできます

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

proplists:get_value と同じ結果が得られますが、より高速です。

ソース: http://www.ostinelli.net/erlang-listskeyfind-or-proplistsget_value/

于 2015-06-12T21:15:20.863 に答える
1
find(K, [H|T]) ->
    case H of
        {K, V} -> V;
        _ -> find(K, T)
    end;
find(_, []) -> none.
于 2016-02-06T18:29:08.287 に答える