2011-08-03 16 views
5

में सदस्यता के लिए जांच करना Erlang में एक कथन लिखने का सबसे आसान तरीका क्या है, जहां गार्ड का एक हिस्सा member(E, L) है, यानी EL सूची का सदस्य है? अनुभवहीन दृष्टिकोण है:एरलांग गार्ड

if 
    ... andalso member(E,L) -> ... 
end 

लेकिन है क्योंकि काम नहीं करता है, अगर मैं सही ढंग से समझ, member एक गार्ड अभिव्यक्ति नहीं है। किस तरह से काम करेगा?

उत्तर

12

सदस्य कार्यक्षमता, जैसा कि आप कहते हैं, वैध गार्ड नहीं है। इसके बजाय आप केस पैटर्न का उपयोग करने पर विचार कर सकते हैं? केस अभिव्यक्ति में आपके अन्य if-clauses को शामिल करना संभव है।

case {member(E,L),Expr} of 
    {true,true} -> do(), is_member; 
    {true,false} -> is_member; 
    {false,_} -> no_member 
end 
+0

अच्छा। मुझे बूलियन का उपयोग क्लॉज के रूप में करने से बचने की उम्मीद थी, लेकिन कम से कम यह मुझे किसी कथन के अंदर केस स्टेटमेंट घोंसले की आवश्यकता को बचाता है। –

+1

मामले बयान में बूलियन का उपयोग करना काफी आम है, शायद "अगर" के किसी भी उपयोग से अधिक आम है। –

6

Erlang में एक गार्ड में सूची सदस्यता का परीक्षण करना संभव नहीं है। आपको यह करना है:

f(E, L) -> 
    case lists:member(E, L) of 
     true -> ...; 
     false -> ... 
    end. 
2

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