पर लिखने में त्रुटि टाइप करें क्या यह प्रकार चेकर में एक बग है?वैध फॉरल प्रकार को एक लेट-बाउंड वैरिएबल
Prelude> let (x :: forall a. a -> a) = id in x 3
<interactive>:0:31:
Couldn't match expected type `forall a. a -> a'
with actual type `a0 -> a0'
In the expression: id
In a pattern binding: (x :: forall a. a -> a) = id
तथ्य यह है कि इसके बाद के संस्करण प्रकार की जांच करने में विफल रहता है, लेकिन इस विकृति सफल होता है:
Prelude> let (x :: (forall a. a -> a) -> Int) = (\f -> f 3) in x id
3
मुझे सुराग को लगता है कि "कमजोर prenex रूपांतरण" (this paper का पेज 23 देखें) किसी भी तरह संबंधित हो सकती है । एक forall
को एक विरोधाभासी स्थिति में एम्बेड करना जहां इसे "फ़्लोट आउट" नहीं किया जा सकता है, यह इस अजीब त्रुटि से सुरक्षित रखने के लिए प्रतीत होता है।
दिलचस्प। मुझे जीएचसी 6.12.1 पर एक अलग त्रुटि संदेश मिलता है: "अनुमानित प्रकार अपेक्षित से कम polymorphic है। मात्राबद्ध प्रकार चर 'अभिव्यक्ति' में से बचता है: आईडी"। – hammar
मैं जीएचसी 7.2.1, एफडब्ल्यूआईडब्ल्यू का उपयोग कर रहा हूं। –
मैं गलत हो सकता हूं (मैं एक पुराने जीएचसी पर हूं), लेकिन यह कानूनी हास्केल 98/2010 नहीं है। आपके पास क्या एक्सटेंशन हैं? यह समझा सकता है कि क्या हो रहा है। (मुझे हथौड़ा के समान त्रुटि मिलती है, इसलिए समस्या यह हो सकती है कि 'ए' का मतलब यह नहीं है कि आप क्या उम्मीद करते हैं।) –