2012-07-05 8 views
12

मुझे एक समारोह चाहिए जैसे कि यह संभव है? वास्तव में , मुझे नहीं पता कि पैटर्न पैटर्न मौजूद है या नहीं।क्या मैं एक समारोह में एक पैटर्न पास कर सकता हूं?

fun1 a :: Pattern a -> a -> Bool 
fun1 pattern a = case a of 
    pattern -> True 
    _ -> False 
+1

मैं बात नहीं करते एफ # है, लेकिन मुझे लगता है कि [सक्रिय पैटर्न] (http: // msdn.microsoft.com/en-us/library/dd233248.aspx) कुछ ऐसा ही कर सकता है। – phg

उत्तर

13

मुझे नहीं लगता कि यह हास्केल में संभव है।

हालांकि, आपके मामले में, पैटर्न प्रभावी रूप से a -> Bool प्रकार का एक कार्य है। तो पैटर्न को स्वीकार करने के बजाय, a से Bool से किसी भी फ़ंक्शन को स्वीकार करें। उदाहरण के लिए a पर फ़ंक्शन a -> Bool लागू करने के बराबर उदाहरण है।

अब, यदि आप कुछ और सामान्य करना चाहते हैं, जैसे fun1 के शरीर में पैटर्न से मिलान किए गए प्रतीकों का उपयोग करने में सक्षम होने के नाते, आप इसे किसी फ़ंक्शन के साथ करने में सक्षम नहीं होंगे। हालांकि, मुझे संदेह है कि हास्केल के साथ यह संभव है - इसे किसी भी अर्थ के लिए टाइप सिस्टम में अजीब एक्सटेंशन की आवश्यकता होगी। हास्केल में पैटर्न मिलान बिल्कुल प्रथम श्रेणी का नागरिक नहीं है, इसलिए आप वास्तव में इस तरह के पैटर्न को पार नहीं कर सकते हैं।

यदि आप इस तरह के व्यवहार चाहते हैं, तो Pattern Calculus पुस्तक देखें जहां लेखक हास्केल की तुलना में अधिक सामान्य पैटर्न-मिलान सुविधाओं वाली भाषा विकसित और औपचारिक रूप से तैयार करता है। यह हास्केल के विपरीत पैटर्न को प्रथम श्रेणी के नागरिक बनाता है। मैंने अभी तक इस पुस्तक को वास्तव में समाप्त नहीं किया है, लेकिन मुझे पूरा यकीन है कि इस तरह का कोड वही है जो आप अन्य चीजों के साथ लिखने में सक्षम होंगे।

लेखक ने bondi नामक पैटर्न मिलान के बारे में अपने विचारों के चारों ओर एक भाषा बनाई; शायद यह जांचने लायक भी है, खासकर अगर आप पुस्तक से परेशान नहीं होना चाहते हैं। मुझे नहीं पता कि यह व्यावहारिक उपयोग के लिए तैयार है, लेकिन यह निश्चित रूप से दिलचस्प है।

+0

ghc में संस्करण 610 (04-नवंबर -2008) के बाद से यह व्यूपटर एक्सटेंशन है। उस वाक्य रचनात्मक विस्तार के साथ, वे "पैटर्न" केवल परिणाम-से-आगे-पैटर्न-मिलान के लिए मूल्य-से-विश्लेषण-विश्लेषण से मैपिंग कार्य कर रहे हैं। – comonad

+0

@comonad: मुझे यकीन नहीं है कि व्यूपटर एक्सटेंशन यहां लागू है - यह आपको उन कार्यों के रूप में फ़ंक्शंस का उपयोग करने देता है जहां ओपी पैटर्न के रूप में पैटर्न का उपयोग करना चाहता है। –

+0

मैं आपके दूसरे खंड का जिक्र कर रहा था: "..., मजेदार 1 के शरीर में पैटर्न से मिलान किए गए प्रतीकों का उपयोग करने में सक्षम होने की तरह, आप इसे एक समारोह के साथ करने में सक्षम नहीं होंगे।" खैर, व्यूपेटर्न का उपयोग करके, उस फ़ंक्शन/पैटर्न को मिलान की बाइंडिंग को वापस करना होगा ताकि कॉलर उन्हें अपने स्वयं के चर से जोड़ सके या पैटर्न से आगे मिलान कर सके। यदि वह बहुत वर्बोज़ होगा (और यदि मुझे सही याद है), तो रिकॉर्डविल्डकार्ड के साथ एक चाल मौजूद है जो आपको विशिष्ट नामित चर को एक मान में जोड़ती है। – comonad

0

मुझे पूरा यकीन है कि आप देख रहे हैं पैटर्न देखें।

(trac/ghc/wiki देख सकते हैं या ghc/user-manual/syntax-extensions)


हर समारोह एक "पैटर्न" है:

case "string that ends with x" of 
    (last->'x') -> True 
    _ -> False 

case "foo" of 
    (elemIndex 'g'->Just i) -> i+5 
    (elemIndex 'f'->Nothing) -> 23 
    _ -> 42 

do 
    x <- fmap foo bar 
= 
do 
    (foo->x) <- bar 
+1

मुझे लगता है कि वह विपरीत के लिए पूछ रहा था - पैटर्न के रूप में कार्यों का उपयोग करने के बजाय, वह पैटर्न को कार्यों के रूप में उपयोग करना चाहता था। तो वह 'fun1 (बस x) a' को कॉल करने में सक्षम होना चाहता था और * पैटर्न *' बस x' के विरुद्ध 'ए' के मान से मेल खाता था।स्वीकार्य उत्तर में लिखी गई लाइब्रेरी आपको ऐसा करने देती है। मुझे नहीं लगता कि ViewPatterns आपको ऐसा करने देते हैं। –

+0

टिखोन जेल्विस: दिलचस्प, उस विचार पर विचार नहीं किया। असल में, जेसन ने पैटर्न के रूप में पैटर्न का उपयोग करने के लिए कहा। लेकिन एक पैटर्न से एक समारोह बनाने के लिए तुच्छ है। AFAIC जेसन स्टैक ओवरफ्लो के लिए नया है और इसे टिप्पणी किए बिना किसी भी उत्तर को स्वीकार किया है; मुझे इतना यकीन नहीं है कि वह केवल एक विशिष्ट जवाब चाहता था। – comonad

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

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