2012-06-21 9 views
6

एक एर्लांग सूची समझ को कार्यान्वित करें जो सूची से दो तत्व लेता है और सूचियों की एक नई सूची बनाता है।एरलांग: एरलांग सूची समझ को कैसे कार्यान्वित करें?

मैं इस कोड

pair([], Acc) -> lists:reverse(Acc); 

pair(L, Acc0) -> 
    [ A, B | T ] = L, 
    Acc = [ [A, B] | Acc0 ], 
    pair(T, Acc). 

जो ठीक काम करता है है:

7> l:pair(lists:seq(1,6), []). 
[[1,2],[3,4],[5,6]] 

लेकिन ऐसा लगता है जैसे मैं एक सूची समझ के रूप में इस लागू करने के लिए सक्षम होना चाहिए। मेरे Erlang-fu इसके साथ आने के लिए बहुत कमजोर है।

कोई सुझाव?

धन्यवाद

उत्तर

1

एक सूची समझ भद्दा हो जाएगा, क्योंकि यह अनिवार्य रूप से सूची के हर तत्व के लिए कुछ करना चाहिए। एक सूची समझ बनाने के लिए आपको यह पता लगाने की कोशिश करनी चाहिए कि क्या यह एक अजीब तत्व है जिसे आप बात कर रहे हैं। यहाँ मैं किस बारे में बात कर रहा हूँ की एक विचार है:

pair(L) -> 
    L2 = lists:zip(lists:seq(1, length(L)), L), 
    [[A, B] || {Ai, A} <- L2, {Bi, B} <- L2, 
      Ai rem 2 == 1, Bi rem 2 == 0, Ai + 1 == Bi]. 

इस पर समय जटिलता क्योंकि जहाँ तक मुझे पता है हूँ Erlang किसी भी तरह से इस अनुकूलन नहीं करता शायद भयानक है।

मुझे नहीं लगता कि आपके कार्य में कुछ भी गलत है और आपको इसके साथ रहना चाहिए।

8

नहीं, एक सूची समझ यह करने का एक अच्छा तरीका नहीं होगा, परिभाषा के अनुसार वे केवल एक तत्व पर एक बार काम करते हैं। आपके कोड में वास्तव में एक संचयक का उपयोग करने की आवश्यकता नहीं है, गति में अंतर छोटा है, here, और यह इसके बिना स्पष्ट हो जाता है। मुझे कम से कम लगता है।

pairs([A,B|L]) -> 
    [[A,B]|pairs(L)]; 
pairs([]) -> []. 
+1

यह एरलांग मंत्र का पालन करता है "इसे क्रैश करें", उदा। मामले के लिए '[ए]'। – Tilman

+0

@ टिलमैन हां, फ़ंक्शन ** परिभाषित ** तत्वों के जोड़े लेने के लिए है, इसलिए यदि सूची में तत्वों की एक विषम संख्या है तो यह एक त्रुटि है। आप हमेशा निश्चित रूप से परिभाषित कर सकते हैं कि उस मामले में क्या हो रहा है और इसके बाद इसे संभाल लें। – rvirding