2014-07-15 9 views
6

मैं ऐसी स्थिति में आया हूं जहां मैं ऑपरेटरों पर पैटर्न मिलान करना चाहता हूं। हालांकि, यह जीएचसी के साथ Pattern match(es) are overlapped त्रुटि फेंकता है। मैं समझ नहीं सकता क्यों। ऑपरेटरों पर पैटर्न मिलान की अनुमति नहीं है? मुझे लगता है कि converts it into an identifier कोष्ठक में ऑपरेटर प्रतीक संलग्न करने के बाद, यह काम करना चाहिए था।पैटर्न मिलान (एस) ओवरलैप हैं - ऑपरेटरों पर पैटर्न मिलान

test :: (Integer -> Integer -> Integer) -> String 
test (+) = "plus" 
test (-) = "minus" 
test _ = "other" 

मैं अन्य तरीकों से पूरा कर सकता हूं जो मैं करना चाहता हूं। मैं सिर्फ उत्सुक हूं कि यह क्यों काम नहीं करता है।

+9

आपकी पहली पंक्ति किसी भी फ़ंक्शन से मेल खाती है और स्थानीय रूप से इसे इंफिक्स ऑपरेटर + से जोड़ती है। बाद की रेखाएं इस प्रकार आवश्यकताओं के लिए अधिशेष हैं, इसलिए चेतावनी। ध्यान दें कि फ़ंक्शन प्रतीक, इन्फिक्स या नहीं, सभी इस तरह से मेल खाने वाले पैटर्न द्वारा स्थानीय रूप से रीबाउंड हो सकते हैं। केवल पूंजीकृत कन्स्ट्रक्टर (या: -prefixed इंफिक्स कन्स्ट्रक्टर) और अक्षर केवल खुद से मेल खाते हैं, और फिर केवल प्रथम क्रम प्रकार में। हास्केल (लगभग) कार्यों के आकस्मिक गुणों का निरीक्षण करने का कोई तरीका नहीं देता है: (अलग-अलग) आप उन्हें लागू करके केवल अपने विस्तारित गुणों का फायदा उठा सकते हैं। "क्या यह + समारोह है?" अनुमति नहीं है – pigworker

+0

@ पिगवर्कर, यह बताता है कि मुझे 'इस बाध्यकारी ओवरहाडो मौजूदा प्रीड्यूड परिभाषा' संदेश क्यों मिल रहा था। जानकारी के लिए धन्यवाद। –

उत्तर

12

(+) और (-) प्रकार Integer -> Integer -> Integer की कंस्ट्रक्टर्स नहीं हैं:

  • वे निर्माता के नाम
  • Integer -> Integer -> Integer एक बीजीय डेटाप्रकार नहीं है नहीं कर रहे हैं

और इसलिए अपने कोड का उपयोग कर किसी भी के बराबर है पहले तर्क को बांधने के लिए अन्य परिवर्तनीय नाम, उदाहरण के लिए

test foo = "plus" 
test bar = "minus" 
test _ = "other" 

जो उम्मीद है कि यह स्पष्ट है कि सभी तीन पैटर्न वास्तव में कुछ भी (और पहले दो बाँध कुछ नाम) से मेल करता है। दूसरे शब्दों में, आपके उदाहरण में पहले पैटर्न (foo, या (+)) के माध्यम से गिरने के लिए कोई रास्ता नहीं है, जिसके कारण यह शेष दो के साथ ओवरलैप हो जाता है।

+0

समझा। धन्यवाद! –

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