पहले एक छोटी अवधि शब्दावली मोड़: मैं इन दोनों "पैटर्न मिलान" को कॉल करूंगा। मुझे यकीन नहीं है कि पैटर्न-मिलान-थ्रू-केस-पैटर्न और मिलान-मिलान-बहु-परिभाषा को अलग करने के लिए एक अच्छी अवधि है।
दोनों के बीच तकनीकी भेद वास्तव में काफी हल्का है। -ddump-simpl
ध्वज का उपयोग करके, जीएचसी को दो कार्यों के लिए उत्पन्न कोर को डंप करने के लिए आप इसे स्वयं सत्यापित कर सकते हैं। मैंने इसे कुछ अलग अनुकूलन स्तरों पर आजमाया, और सभी मामलों में कोर में केवल अंतर ही नामकरण कर रहे थे। (वैसे, अगर कोई कोर के लिए एक अच्छा "अर्थात् diff" प्रोग्राम जानता है - जो कम से कम अल्फा समकक्षता के बारे में जानता है - मुझे इसके बारे में सुनने में बहुत दिलचस्पी है!)
कुछ छोटे हैं हालांकि, देखने के लिए गेटचास। आप सोच सकते हैं कि निम्नलिखित समकक्ष भी है:
{-# LANGUAGE LambdaCase #-}
lastButOne = \case
[] -> error "Empty List"
(x:[]) -> error "Only One Element"
(x:[x2]) -> x
(x:xs) -> lastButOneCase xs
इस मामले में, उत्तर हाँ है। लेकिन पर विचार यह एक समान दिखने वाले एक:
-- ambiguous type error
sort = \case
[] -> []
x:xs -> insert x (sort xs)
एक यह अचानक एक typeclass-बहुरूपी सीएएफ है, और इसलिए वर्ष GHCs पर इस monomorphism प्रतिबंध को गति प्रदान और एक त्रुटि का कारण है, एक साथ अल्पज्ञता समान संस्करण जबकि होगा स्पष्ट तर्क नहीं करता है:
-- this is fine!
sort [] = []
sort (x:xs) = insert x (sort xs)
अन्य मामूली अंतर (जो मैं बारे में भूल गया - मुझे याद दिलाने के लिए Thomas DuBuisson को धन्यवाद) जहां खंड की हैंडलिंग में है। चूंकि बाध्यकारी साइटों से क्लॉज जुड़े हुए हैं, इसलिए उन्हें कई समीकरणों में साझा नहीं किया जा सकता है लेकिन कई मामलों में साझा किया जा सकता है।
-- error; the where clause attaches to the second equation, so
-- empty is not in scope in the first equation
null [] = empty
null (x:xs) = nonempty
where empty = True
nonempty = False
-- ok; the where clause attaches to the equation, so both empty
-- and nonempty are in scope for the entire case expression
null x = case x of
[] -> empty
x:xs -> nonempty
where
empty = True
nonempty = False
आप इस का मतलब है आप समीकरणों के साथ कुछ है कि आप मामले भाव के साथ ऐसा नहीं कर सकते कर सकते हैं सोच सकते हैं, अर्थात्, दो समीकरणों में एक ही नाम के लिए अलग अलग अर्थ है, इस तरह है::
उदाहरण के लिए
null [] = answer where answer = True
null (x:xs) = answer where answer = False
हालांकि, case
भाव के पैटर्न के बाद से बाध्यकारी साइटों रहे हैं, इस case
भाव में नकल करते किया जा सकता है और साथ ही:
null x = case x of
[] -> answer where answer = True
x:xs -> answer where answer = False
चाहे where
खंड case
के पैटर्न से जुड़ा हुआ है या समीकरण के लिए, इंडेंटेशन पर निर्भर करता है।
मैं दो लाइनों को छोटा करना चाहता हूं। – Bergi
केस अभिव्यक्तियों को एक ही पैटर्न मिलान का उपयोग नहीं करते हैं, केवल एक अलग वाक्य रचनात्मक निर्माण के अंदर? – 9000
एक केस अभिव्यक्ति को किसी अन्य अभिव्यक्ति में एम्बेड किया जा सकता है, जरूरी नहीं कि फ़ंक्शन परिभाषा का शीर्ष एक हो। मुझे लगता है कि पैटर्न के साथ कई समारोह घोषणाएं दूसरे रूप में सिर्फ एक वाक्य रचनात्मक चीनी है। – 9000