2012-07-30 19 views
5

संभव डुप्लिकेट:
Why don't Haskell list comprehensions cause an error when pattern match fails?गैर संपूर्ण हास्केल सूची समझ में पैटर्न

आज मैं निम्नलिखित कोड देखा:

Prelude> [a | Just a <- [Just 10, Nothing, Just 20]] 
[10, 20] 

यह काम करता है। लेकिन मैंने सोचा था कि उपरोक्त सूची समझ बस वाक्यात्मक चीनी है के लिए ...

[Just 10, Nothing, Just 20] >>= (\(Just x) -> return x) 

... जिसके लिए हास्केल, जब Nothing का सामना, एक त्रुटि *** Exception: Non-exhaustive patterns in lambda फेंकना होगा।

तो मेरा सवाल है: [a | Just a <- [Just 10, Nothing, Just 20]] क्या (मोनैडिक कोड के संदर्भ में) में अनुवाद करता है जो इसे Nothing को अनदेखा करता है?

+0

@ephemient: धन्यवाद! जिस पोस्ट से आपने लिंक किया है वह मेरे प्रश्न का उत्तर देता है। और मैंने पाया [एक और] (http://stackoverflow.com/questions/7007222/haskell-list-comprehension-to-combinatory)। मेरे प्रश्न पोस्ट करने से पहले मुझे इन पदों को नहीं मिला क्योंकि वे "संपूर्ण" शब्द नहीं रखते हैं, जो समस्या के लिए हास्केल का शब्द है। (मैं स्टैक ओवरफ्लो में नया हूं और मुझे यकीन नहीं है कि मुझे क्या करना है। क्या मुझे यह प्रश्न हटाना चाहिए? यह अभी भी उन लोगों के लिए उपयोगी होगा जो "[non-] संपूर्ण" टाइप करेंगे।) –

+0

आप हटाने की जरूरत नहीं है - आखिरकार इसे एक डुप्लिकेट के रूप में बंद कर दिया जाएगा, जिसका अर्थ यह है कि यहां से अग्रेषित लोगों के उत्तर के साथ शीर्ष अग्रेषण करने वाले लोगों का एक बड़ा लिंक होगा। और, जैसा कि आप ध्यान देते हैं, मारने के बजाए चारों ओर रखना ज्यादा उपयोगी है :) – ephemient

उत्तर

2

मुझे लगता है कि that other question में सबसे अच्छा जवाब वास्तव में एक संदर्भ 'कंपाइलर जादू' है। आप पैटर्न Just x मिलान कर रहे हैं, और Haskell 2010 Report के अनुसार व्यवहार ..

के रूप में निर्दिष्ट किया जाता है, तो एक मैच तो सूची बस के ऊपर छोड़ दिया है कि तत्व विफल रहता है।

तो मुझे लगता है कि कार्यान्वयन कृपया ऐसा करने के लिए स्वतंत्र हैं (यानी, desugaring आवश्यक रूप से अद्वितीय नहीं है)।

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