मैं समझने की कोशिश कर रहा हूं कि पैटर्न मिलान के संबंध में हास्केल सूची की समझ "हुड के तहत" कैसे काम करती है। निम्नलिखित GHCi उत्पादन मेरी बात दिखाता है:पैटर्न मिलान विफल होने पर हास्केल सूची की समझ में कोई त्रुटि क्यों नहीं होती है?
Prelude> let myList = [Just 1, Just 2, Nothing, Just 3]
Prelude> let xs = [x | Just x <- myList]
Prelude> xs
[1,2,3]
Prelude>
आप देख सकते हैं, यह "कुछ भी नहीं" छोड़ सकते हैं और केवल "बस" मान चुनने के लिए सक्षम है। मैं समझता हूँ कि सूची एक इकाई के रूप में परिभाषित है (, असली दुनिया हास्केल से स्रोत ch 14।):
instance Monad [] where
return x = [x]
xs >>= f = concat (map f xs)
xs >> f = concat (map (\_ -> f) xs)
fail _ = []
इसलिए, एक सूची समझ मूल रूप से सूची समझ में चयनित प्रत्येक तत्व के लिए एक सिंगलटन सूची बनाता है और उन्हें संयोजित । यदि कोई पैटर्न मिलान कुछ चरणों में विफल रहता है, तो इसके बजाय "विफल" फ़ंक्शन का परिणाम उपयोग किया जाता है। दूसरे शब्दों में, "जस्ट एक्स" पैटर्न मेल नहीं खाता है [] को प्लेसहोल्डर के रूप में उपयोग किया जाता है जब तक कि 'कंसट' कहा जाता है। यह बताता है कि "कुछ भी नहीं" क्यों छोड़ा गया है।
जो मुझे समझ में नहीं आता है, हास्केल कैसे "असफल" फ़ंक्शन को कॉल करने के बारे में जानता है? क्या यह "कंपाइलर जादू" है, या कार्यक्षमता जिसे आप स्वयं हास्केल में लिख सकते हैं? क्या सूची समझ के समान तरीके से काम करने के लिए निम्नलिखित "चयन" फ़ंक्शन लिखना संभव है?
select :: (a -> b) -> [a] -> [b]
select (Just x -> x) myList -- how to prevent the lambda from raising an error?
[1,2,3]
धन्यवाद! यह प्रतिक्रिया जो मैं पढ़ रहा हूं उससे मेल खाती है और सूची के अलावा अन्य प्रकार के पैटर्न-मिलान व्यवहार को बताती है। यह मेरे लिए नहीं हुआ था कि संकलक विफल होने पर निर्धारित करने के लिए इस तरह के केस स्टेटमेंट का उपयोग कर सकता है। यह पूरी तरह से समझ में आता है। – Cybis