2012-04-25 2 views
5

निम्नलिखित के साथ क्या चल रहा है?ईटा कमी कब एक समारोह के प्रकार को बदल सकता है?

> let test = map show 

> :t test 
test :: [()] -> [String] 

> :t (map show) 
(map show) :: Show a => [a] -> [String] 

मुझे आश्चर्य है कि मैं इससे पहले कैसे नोटिस करने में असफल रहा? मुझे वास्तव में दिखाने के बजाय "इंटग्रल से नक्शा" के साथ समस्या का सामना करना पड़ा - मेरा कोड पॉइंट फ्री फॉर्म के साथ संकलित नहीं है, लेकिन ईटा कमी के बिना ठीक काम करता है।

क्या ईटा कमी में हास्केल कोड का अर्थ बदल सकता है, तो क्या कोई सरल स्पष्टीकरण है?

उत्तर

11

यह monomorphism restriction है, जो लागू होता है जब बाध्यकारी पैरामीटर नहीं लेता है और बाध्यकारी को साझा करने की अनुमति देता है जब यह अन्यथा बहुरूपता के कारण नहीं होता है, सिद्धांत पर कि यदि आप इसे पैरामीटर नहीं देते हैं आप इसे "स्थिर" -श (इसलिए साझा) के रूप में व्यवहार करना चाहते हैं। आप इसे ghci में :set -XNoMonomorphismRestriction से अक्षम कर सकते हैं; यह अक्सर ghci में उपयोगी होता है, जहां आप अक्सर इस तरह के अभिव्यक्तियों को पूरी तरह से पॉलिमॉर्फिक होने का इरादा रखते हैं।

+0

वाह मैं माफी चाहता हूँ (एक हास्केल स्रोत फ़ाइल में, पहली पंक्ति

{-# LANGUAGE NoMonomorphismRestriction #-} 
बजाय

बनाते हैं।), पता होना चाहिए। मैंने भाषा प्रगामा भी कोशिश की थी लेकिन हैश संकेतों को शामिल करना भूल गया था, और जीएचसी "संभावित कारण" के बारे में सामान्य बात नहीं कह रहा था। – sacheie

+9

सटीक होने के लिए यह जीएचसीआई के विस्तारित डिफ़ॉल्ट नियमों के साथ संयुक्त monomorphism प्रतिबंध है। – sepp2k

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