Erlang

2012-06-03 18 views
7

में {key, value} सूची में कोई मान ढूँढना मैं Erlang के लिए नया हूं और शायद मैं ट्रिगर में इस समस्या को याद करता हूं हालांकि यह मामूली है। मान लीजिए, मेरे पास erlang से प्राप्त {कुंजी, मान} जोड़े की एक सूची है: fun_info/1। मैं कार्य धैर्य जानना चाहता हूं, बाकी की सूची मेरे लिए कोई रूचि नहीं रखती है। इसलिए मैं की तरह कुछ लिखें:Erlang

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 की तरह कुछ एक बहुत आम दिनचर्या यह लिखने के लिए किया जाना चाहिए? हालांकि मैं बीआईएफ में अपना एनालॉग नहीं ढूंढ पाया। तो सवाल यह है: {कुंजी, मूल्य} tuples की सूची से एक कुंजी के लिए मूल्य प्राप्त करने के लिए यह एक अच्छा सुरुचिपूर्ण तरीका है?

उत्तर

10

lists:keyfind/3 यह करता है। यहाँ मैं यह अपने find_value/2 इंटरफेस में मैप किया गया है:

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

proplists एक और भी बेहतर मार्ग है, हालांकि हो सकता है।

4

सूचियों के बाद से: keyfind/3 पहले से ही तैनात किया गया था, मैं एक और उपयोगी विकल्प उल्लेख करेंगे, सूचियों comprehensions का उपयोग कर:

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 
+0

यह बहुत अच्छा लगता है, लेकिन मैं फिर एक और मूर्खतापूर्ण सवाल है: ': = =' क्या है? क्यों '==' अवांछित है? – akalenuk

+0

हाय! == संख्याओं की तुलना करने के लिए उपयोग किया जा सकता है, ताकि 1.0 बराबर 1 हो, लेकिन अन्य तुलनाओं में, आपको "सटीक" तुलना ऑपरेटर का उपयोग करना चाहिए, जो = = = (और 1.0 से 1.0 अलग करेगा), देखें: http://www.erlang.org/doc/reference_manual/expressions.html#id76768 – marcelog

+3

यह दृष्टिकोण आलसी हास्केल के लिए अच्छा है, लेकिन एरलांग में इसे किसी भी मामले में संपूर्ण 'सूची' को पार करना होगा, जबकि 'get_value/2' बंद होने पर रोकता है पहला मैच –

2

proplists:get_value तरह से यह करने के लिए यदि आप गति

lists:keyfind यह प्रदर्शन के लिए सबसे अच्छा विकल्प है के बारे में परवाह नहीं है के बाद से एक BIF है । आप इस

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

की तरह एक element/2 साथ wrapit कर सकते हैं और अगर आप proplists का एक ही परिणाम प्राप्त होगा: get_value लेकिन तेजी से।

स्रोत:http://www.ostinelli.net/erlang-listskeyfind-or-proplistsget_value/

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

 संबंधित मुद्दे