2011-07-17 18 views
16

मैंतुच्छ पारसेक उदाहरण एक प्रकार की त्रुटि

import Text.Parsec 
simple = letter 

संकलित करने के लिए इस तुच्छ पारसेक कोड प्राप्त करने की कोशिश कर रहा हूँ, लेकिन मैं यह त्रुटि

No instance for (Stream s0 m0 Char) 
    arising from a use of `letter' 
Possible fix: add an instance declaration for (Stream s0 m0 Char) 
In the expression: letter 
In an equation for `simple': simple = letter 
+0

मैं असहमत हूं कि यह एक डुप्लिकेट है। हां, वे एक ही मूल मुद्दे से चिंतित हैं, लेकिन यह सवाल सामान्य है, जहां यह एक विशिष्ट है। समस्या के इस विशिष्ट उदाहरण की खोज करने वाले किसी को भी प्रतिबंध के बारे में पूरी जानकारी जानने की आवश्यकता नहीं है, उन्हें समस्या को हल करने के तरीके की विशिष्ट सिफारिशों की आवश्यकता है - विशेष रूप से, उन्हें यह जानने की आवश्यकता है कि इस तरह के लिए सही प्रकार का हस्ताक्षर क्या है समारोह होगा। – Jules

उत्तर

19

मुझे लगता है कि आप के खिलाफ भाग गया है बार आ रही है पैदा करता है monomorphism प्रतिबंध। इस प्रतिबंध का अर्थ है: यदि किसी चर को कोई स्पष्ट तर्क के साथ घोषित नहीं किया गया है, तो इसका प्रकार मोनोमोर्फिक होना चाहिए। यह टाइपशेकर को Stream का एक विशेष उदाहरण चुनने के लिए मजबूर करता है, लेकिन यह तय नहीं कर सकता है।

  1. दें simple एक स्पष्ट हस्ताक्षर:

    {-# LANGUAGE NoMonomorphismRestriction #-} 
    import Text.Parsec 
    simple = letter 
    

देखें 012,308:

simple :: Stream s m Char => ParsecT s u m Char 
simple = letter 
  • monorphism प्रतिबंध अक्षम

    इसमें लड़ने के लिए दो तरीके हैं Monomorphism प्रतिबंध पर अधिक जानकारी के लिए।

  • +0

    ओह, आमतौर पर आपको यह कहते हुए एक त्रुटि मिलती है कि "यह मोनोमोर्फिज्म प्रतिबंध के कारण ऐसा नहीं कर सकता" जब ऐसा होता है। – Peter

    +1

    मुझे नहीं पता कि यह ऐसा क्यों है। यह जीएचसी 7 में नए प्रकार के अनुमान इंजन से संबंधित है। – fuz

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