यह वास्तव में काफी सरल है। के GHCi पूछना क्या isList2
के प्रकार है दो:
∀x. x ⊢ :t isList2
isList2 :: a -> Bool
यह [a]
उदाहरण से मेल नहीं खाता (यहां तक कि यह हो सकता है, हालांकि, एकीकरण के माध्यम से), लेकिन यह तुरंत a
उदाहरण से मेल नहीं करता है। इसलिए, जीएचसी a
उदाहरण का चयन करता है, इसलिए isList2
False
देता है।
यह व्यवहार ठीक है IncoherentInstances
का अर्थ है। असल में, यह इसका एक अच्छा प्रदर्शन है।
उल्लासपूर्वक, अगर आप बस IncoherentInstances
अक्षम करें, हम बिल्कुल विपरीत प्रभाव मिलता है, और GHCi अब यह कहते हैं:
∀x. x ⊢ :t isList2
isList2 :: [Integer] -> Bool
यह इसलिए होता है क्योंकि isList2
एक शीर्ष स्तर बंधन समारोह सिंटेक्स के उपयोग से परिभाषित नहीं है , और इस प्रकार ड्रेडेड मोनोमोर्फिज्म प्रतिबंध के अधीन है। इसलिए यह उस उदाहरण के लिए विशिष्ट हो जाता है जिसका वास्तव में इसका उपयोग किया जाता है।
∀x. x ⊢ :t isList2
isList2 :: IsList a => a -> Bool
∀x. x ⊢ isList2 'a'
False
∀x. x ⊢ isList2 "a"
True
∀x. x ⊢ isList2 undefined
<interactive>:19:1:
Overlapping instances for IsList a0 arising from a use of `isList2'
कौन सा उम्मीद अतिव्यापी व्यवहार है, उदाहरण के उपयोग और शिकायतों के आधार पर करता है, तो पसंद अस्पष्ट है चुना के साथ:
IncoherentInstances
अक्षम करने के रूप में जोड़ा जा रहा है NoMonomorphismRestriction
रूप में अच्छी तरह से, हम इस के बजाय मिलता है।
प्रश्न के संपादन के संबंध में, मुझे विश्वास नहीं है कि वांछित परिणाम बिना एनोटेशन के संभव है।
पहला विकल्प isList2
एक प्रकार का हस्ताक्षर देना है, जो IncoherentInstances
को बहुत जल्दी उदाहरण चुनने से रोकता है।
isList2 :: (IsList a) => a -> Bool
isList2 = isList
आप शायद एक तर्क के लिए लागू किया जा रहा है बिना कहीं और isList
उल्लेख किया है (यहां तक कि परोक्ष रूप से) भी ऐसा ही करने की आवश्यकता होगी।
दूसरा विकल्प संख्यात्मक अक्षरों को असंबद्ध करना और IncoherentInstances
अक्षम करना है।
main =
print (isList (42 :: Integer)) >>
print (isList2 (42 :: Integer)) >>
print (isList [42]) >>
print (isList2 [42])
इस मामले में, वहाँ पर्याप्त जानकारी एक सबसे विशिष्ट उदाहरण लेने के लिए है, तो OverlappingInstances
अपनी बात करता है।
क्योंकि आपका प्रोग्राम असंगत है। वास्तव में, आपने * क्या उम्मीद की *? –
मुझे उम्मीद थी कि आउटपुट 'ट्रू ट्रू' होगा, न कि 'ट्रू फाल्स'। आप आउटपुट को 'सच गलत' क्यों होने की उम्मीद करते हैं? अनौपचारिक कार्यक्रम 'ट्रू ट्रू' क्यों नहीं लौटाएगा? क्या आप कह रहे हैं कि आउटपुट के लिए कोई कारण नहीं है, और नतीजा अनिर्धारित है, और वास्तव में यह वास्तव में 'ट्रू ट्रू' वापस कर सकता है? – Clinton
संभावित डुप्लिकेट [इंकोइन्टेंट इंस्टेंस कैसे काम करता है?] (Http://stackoverflow.com/questions/8371499/how-does-incoherentinstances-work) –