2015-03-25 8 views
5

मैं केस स्टेटमेंट में कई अलग-अलग रचनाकारों से मिलान करने की कोशिश कर रहा हूं। सादगी के लिए, आधे मामलों में मान लें कि हम एक ही काम करते हैं, और दूसरे छमाही में हम कुछ और करते हैं। यहां तक ​​कि अगर मैं एक समारोह के लिए तर्क को अलग, मैं अभी भी लिखने के लिए है:केस स्टेटमेंट पैटर्न को कैसे गठबंधन करें

case x of 
    C1 -> foo x 
    C2 -> foo x 
    ... 
    C10 -> bar x 
    C11 -> bar x 
    ... 

वहाँ मामले बयान सी में switch अधिक जैसे बयानों से व्यवहार करते हैं बनाने के लिए कुछ रास्ता नहीं है (fallthrough साथ यानी), या तो यह है कि मैं यह कर सकते हैं

case x of 
    C1, C2, C3 -> foo x 
    C10, C11, C12 -> bar x 

या शायद एक और तरीका यह साफ करने के लिए: एक ही बार में कई पैटर्न में से एक है, जैसे पर मैच?

+0

मैंने 'foo' और 'bar' के लिए तर्क दिया है क्योंकि यह मेरा उपयोग मामला है। यह एक सामान्य विभाजन (जैसे 'सी 1 -> सी 1, सी 2 -> सी 1, सी 3 -> सी 1') में समान रचनाकारों को मर्ज करने के लिए एक अलग विभाजन समारोह का उपयोग करने के बदसूरत लेकिन सही उत्तर को रोकता है, और फिर केवल' सी 1' से मेल खाता है) । – crockeea

उत्तर

8

इन्हें विस्फोटक पैटर्न कहा जाता है, और हास्केल में उनके पास नहीं है। (ओकैमल और एफ # डू।) हालांकि, कुछ सामान्य कामकाज हैं। अपने प्रकार एक गणन है, तो आप समानता, साथ उदाहरण elem के लिए उपयोग कर सकते हैं:

case cond of 
    c 
    | c `elem` [C1, C2, C3] -> foo 
    | c `elem` [C10, C11, C12] -> bar 
    | otherwise -> baz 

और निश्चित रूप से, अगर foo या bar लंबे अभिव्यक्ति कर रहे हैं, धन्यवाद आप बस उन्हें स्थानीय परिभाषाओं में कारक कर सकते हैं आलस्य, तो आप करने के लिए केवल तर्क और तर्क के रूप में आपको आवश्यक पैटर्न पैटर्न को दोहराना होगा:

case cond of 
    C1 x -> foo x 
    C2 y -> foo y 
    ... 
    C10 -> bar 
    C11 -> bar 
    ... 
where 
foo x = something long (involving x, presumably) 
bar = if you please then something else quite long 
+0

आपको बहुत बहुत धन्यवाद! – bemihai22

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