19

मुझे आश्चर्य हुआ कि कार्यात्मक प्रोग्रामिंग भाषाओं (हास्केल/एफ #/कैमल) की पैटर्न मिलान सुविधाओं के साथ कई बार एक ही मूल्य के खिलाफ मिलान करना संभव है या नहीं।पैटर्न मिलान समान मान

बस निम्न उदाहरण के बारे में सोच: जब समारोह दो समान मूल्यों (जो a में संग्रहीत किया जाएगा) के साथ शुरू हो जाती है

plus a a = 2 * a 
plus a b = a + b 

पहले संस्करण का ही कहा जाता है।

यह एक और उपयोगी एप्लीकेशन होगा (एएसटी को सरल बनाना)।

simplify (Add a a) = Mult 2 a 

लेकिन हास्केल इन कोड को खारिज कर दिया और a के लिए परस्पर विरोधी परिभाषाओं की मुझे चेतावनी दी है - मैं बजाय स्पष्ट मामला/अगर-जांच करने के लिए कि क्या समारोह समान मूल्यों मिला लगाना होगा। क्या यह इंगित करने के लिए कोई चाल है कि एक चर जो मैं मिलान करना चाहता हूं वह कई बार होगा?

+0

एफडब्ल्यूआईडब्ल्यू, मैथमैटिका इसका समर्थन करता है। –

उत्तर

39

इसे nonlinear पैटर्न कहा जाता है। इस बारे में हैकेल-कैफे मेलिंग सूची पर कई धागे हैं, बहुत पहले नहीं। यहाँ दो हैं:

http://www.mail-archive.com/[email protected]/msg59617.html

http://www.mail-archive.com/[email protected]/msg62491.html

निष्कर्ष: किसी भी इसे लागू करने के लिए असंभव नहीं है, लेकिन सादगी की खातिर के खिलाफ निर्णय लिया गया।

वैसे, आपको इसके आसपास काम करने के लिए if या case की आवश्यकता नहीं है; (थोड़ा) क्लीनर तरीका एक गार्ड का उपयोग करना है:

a `plus` b 
    | a == b = 2*a 
    | otherwise = a+b 
+0

लिंक के लिए धन्यवाद - उत्कृष्ट – Dario

13

आप संकेत मिलता है कि वे बराबर होना चाहिए ही नाम के दो पैरामीटर नहीं कर सकते हैं, लेकिन आप guards उपयोग कर सकते हैं इस तरह के मामलों को अलग करने के:

plus a b 
    | a == b = 2 * a 
    | otherwise = a + b 

यह अधिक लचीला है, क्योंकि यह भी के लिए काम करता है सरल समानता की तुलना में अधिक जटिल स्थितियां।

+0

हां, मुझे गार्ड पता है लेकिन मैंने किसी मैनुअल तुलना से बचने की कोशिश की। – Dario

+0

इसके लिए किंडा शॉर्टेंड: http: // stackoverflow।कॉम/प्रश्न/48076 9/एफ-मिलान-दो-मूल्यों/501541 # 501541 – Dario

-1

हास्केल एकीकरण नहीं करता है।

+4

दोनों को एकीकरण होने के लिए दोनों तरफ मुक्त चर की आवश्यकता होगी। –

+1

यह समानता है, एकीकरण नहीं। की तरह '| ए, एक जब एक = ए -> ..'। –

0

मैं सिर्फ मेलिंग सूची धागे थॉमस के जवाब में दी गई देखा है, और में उनमें से एक अच्छा समझ में आता है बहुत पहले जबाब, और क्यों इस तरह बताते हैं एक "पैटर्न" सामान्य रूप से ज्यादा समझ में नहीं आता है: क्या होगा यदि a एक फ़ंक्शन है? (सामान्य रूप से यह जांचना असंभव है कि यह दो कार्य बराबर है।)

+0

क्या यह केवल 'ए'' होने के लिए 'a' को बाध्य नहीं कर सका? – gdejohn

+0

@gdejohn, मुझे संदेह है कि अर्थशास्त्र सही नहीं होगा। फॉर्म 'fxx = x'' की परिभाषा लागू करते समय, कोई उचित रूप से आईएमओ की अपेक्षा कर सकता है कि दो सबमिट किए गए तर्क * एक ही मान * हैं, और कुछ प्रकार के वर्ग में केवल "बराबर" नहीं हैं (अन्यथा यह भी स्पष्ट नहीं है कि 'x' के दो मानों में से' f' वापसी चाहिए)। – Alexey

-1

मैंने एक नई कार्यात्मक प्रोग्रामिंग भाषा लागू की है जो हास्केल में गैर-रैखिक पैटर्न को संभाल सकता है।

https://github.com/egison/egison

मेरी भाषा में, अपने plus समारोह के रूप में पालन लिखित में।

(define $plus 
    (match-lambda [integer integer] 
    {[[$a ,a] (* a 2)] 
    [[$a $b] (+ a b)]})) 
संबंधित मुद्दे