2015-10-05 8 views
10

हास्केल में, यदि मैं संघ की एक सूची टाइप किया इस तरह मान:कैसे `में संघ कंस्ट्रक्टर्स पर पैटर्न मैच के लिए .. in`

example :: [Either Int Char] 
example = [Left 3, Right 'b', Left 6, Left 9, Right 'c'] 

मैं सभी को निकालने के लिए एक छोटे से" चाल "का उपयोग कर सकते कुछ विशिष्ट पैटर्न से मेल खाते परिणामों:

let lefts = [for Choice1Of2 l in example -> l] 
       ~~~~~~~~~~~~ 
Incomplete pattern matches on this expression. (...) 

यह:

lefts :: [Int] 
lefts = [l | Left l <- example] 

हालांकि, अगर मैं एफ # करने के लिए इस अनुवाद करने के लिए प्रयास करते हैं, मैं कोई त्रुटि मिलती है बहुत समझ में आता है (यह Right मूल्यों को चुपचाप अनदेखा करने से बेहतर व्यवहार भी हो सकता है जैसे कि हास्केल करता है!), लेकिन एफ # में, किसी सूची में किसी निश्चित पैटर्न से मेल खाने वाले सभी मूल्यों को निकालने (और मिलान) करने का कुछ सुविधाजनक तरीका है/अनुक्रम?

उत्तर

16

एफ # में यदि आप सभी मामलों के खिलाफ मेल नहीं खाते हैं तो आपको सभी परिस्थितियों में चेतावनी मिलेगी।

तो तुम अभिव्यक्ति के अंदर दोनों ही मामलों के साथ मैच में लिख सकते हैं, लेकिन अपने उदाहरण के बजाय comprehensions के लिए मैं समारोह List.choose का प्रयोग करेंगे:

let example = [Choice2Of2 3; Choice1Of2 'b'; Choice2Of2 6; Choice2Of2 9; Choice1Of2 'c'] 
List.choose (function (Choice1Of2 x) -> Some x | _ -> None) example 
// val it : char list = ['b'; 'c'] 

यह समारोह उन मामलों के लिए आसान है।

12

मुझे लगता है कि निकटतम बात आप एफ # सूची भाव का उपयोग कर सकते कुछ इस तरह है:

let lefts example = 
    [ for e in example do 
     match e with Choice1Of2 l -> yield l | _ ->() ] 

अगर मैं हास्केल कोड सही ढंग से समझ, | के बाद वाले हिस्से सिर्फ एक निकालने के रूप में नहीं किया जाता है, लेकिन यह भी फ़िल्टर के रूप में - सभी चीजों पर स्पष्ट रूप से छोड़ना जो पैटर्न से मेल नहीं खाते हैं।

एफ # सूची अभिव्यक्तियों में एक ही तरह की अवधारणा नहीं है, इसलिए आपको अधिक वर्बोज़ होना चाहिए। यहां, हम पर आइटमका उपयोग करके आइटम को फिर से सक्रिय करते हैं और फिर हम स्रोत सूची में प्रत्येक Choice1Of2 के लिए एक नया मान उत्पन्न करने के लिए स्पष्ट रूप से yield का उपयोग करते हैं (और हम बस कुछ और छोड़ते हैं)।

List.choose (जैसा कि गुस्तावो के उत्तर में उल्लिखित) का उपयोग करके आप क्या कर रहे हैं, इस पर निर्भर करता है। लेकिन उपर्युक्त शायद निकटतम है, आप हास्केल की समझ वाक्यविन्यास प्राप्त कर सकते हैं।

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