दिलचस्प पोस्ट
कस्टमएरर्स मोड = "ऑफ़" एक चयन सूची में शब्द लपेटें विकल्प एक लटकती सूचक क्या है साइनस्ड बनाम अनसाइन्ड इंटेजर्स सर्वर की ओर से पता चलता है कि कुकीज़ अक्षम हैं या नहीं जीसीसी के उपयोग में निष्पादन योग्य संसाधनों को एम्बेड करना आईफोन पर एक NSString से एचटीएमएल टैग निकालें स्ट्रिंग से चारों ओर से सभी घटनाओं को निकालें jQuery अपलोड प्रगति और AJAX फ़ाइल अपलोड करें कैसे सी # में JSON स्ट्रिंग बनाने के लिए JSON ऑब्जेक्ट में आइटम "json.dumps" के उपयोग से बाहर हैं? PHP के लिए 500 आंतरिक सर्वर त्रुटि html के लिए नहीं PowerShell में किसी फ़ंक्शन में मैं कई पैरामीटर कैसे पार करूं? एक कंपाइलर लिखना सीखना दुविधा: फ्रैगमेंट बनाम क्रियाकलापों का उपयोग करने के लिए:

Monomorphism प्रतिबंध क्या है?

मुझे हैरान है कि कैसे हेलकेल कम्पाइलर कभी-कभी ऐसे प्रकार का वर्णन करता है जो अपेक्षा करते हैं कि वे अपेक्षा से कम पॉलिमोरिक हैं, उदाहरण के लिए, बिंदु-मुक्त परिभाषाओं का उपयोग करते समय

ऐसा लगता है कि समस्या "मोनोमोर्फिज़्म प्रतिबंध" है, जो संकलक के पुराने संस्करणों पर डिफ़ॉल्ट रूप से है।

निम्नलिखित हैस्केल प्रोग्राम पर विचार करें:

{-# LANGUAGE MonomorphismRestriction #-} import Data.List(sortBy) plus = (+) plus' x = (+ x) sort = sortBy compare main = do print $ plus' 1.0 2.0 print $ plus 1.0 2.0 print $ sort [3, 1, 2] 

अगर मैं इसे ghc साथ संकलन करता हूँ तो मुझे कोई ghc नहीं ghc और निष्पादन योग्य का उत्पादन होता है:

 3.0 3.0 [1,2,3] 

अगर मैं main शरीर को इसमें बदलता हूं:

 main = do print $ plus' 1.0 2.0 print $ plus (1 :: Int) 2 print $ sort [3, 1, 2] 

मुझे कोई संकलन समय त्रुटियां नहीं मिलती हैं और आउटपुट हो जाता है:

 3.0 3 [1,2,3] 

जैसा सोचा था। हालांकि अगर मैं इसे बदलने की कोशिश करता हूं:

 main = do print $ plus' 1.0 2.0 print $ plus (1 :: Int) 2 print $ plus 1.0 2.0 print $ sort [3, 1, 2] 

मुझे एक प्रकार की त्रुटि मिलती है:

 test.hs:13:16: No instance for (Fractional Int) arising from the literal '1.0' In the first argument of 'plus', namely '1.0' In the second argument of '($)', namely 'plus 1.0 2.0' In a stmt of a 'do' block: print $ plus 1.0 2.0 

वही होता है जब विभिन्न प्रकार के साथ दो बार sort करने का प्रयास करते हैं:

 main = do print $ plus' 1.0 2.0 print $ plus 1.0 2.0 print $ sort [3, 1, 2] print $ sort "cba" 

निम्न त्रुटि उत्पन्न करता है:

 test.hs:14:17: No instance for (Num Char) arising from the literal '3' In the expression: 3 In the first argument of 'sort', namely '[3, 1, 2]' In the second argument of '($)', namely 'sort [3, 1, 2]' 
  • ghc अचानक क्यों सोचता है कि plus बहुरूपता नहीं है और एक ghc तर्क की आवश्यकता है? Int का एकमात्र संदर्भ plus आवेदन में है, यह कैसे हो सकता है जब परिभाषा स्पष्ट रूप से बहुरूपक होती है?
  • ghc अचानक क्यों सोचता है कि sort लिए ghc उदाहरण आवश्यक है?

इसके अलावा अगर मैं फ़ंक्शन परिभाषाओं को अपने मॉड्यूल में रखने की कोशिश करता हूं, जैसे:

 {-# LANGUAGE MonomorphismRestriction #-} module TestMono where import Data.List(sortBy) plus = (+) plus' x = (+ x) sort = sortBy compare 

संकलन करते समय मुझे निम्न त्रुटि मिलती है:

 TestMono.hs:10:15: No instance for (Ord a0) arising from a use of 'compare' The type variable 'a0' is ambiguous Relevant bindings include sort :: [a0] -> [a0] (bound at TestMono.hs:10:1) Note: there are several potential instances: instance Integral a => Ord (GHC.Real.Ratio a) -- Defined in 'GHC.Real' instance Ord () -- Defined in 'GHC.Classes' instance (Ord a, Ord b) => Ord (a, b) -- Defined in 'GHC.Classes' ...plus 23 others In the first argument of 'sortBy', namely 'compare' In the expression: sortBy compare In an equation for 'sort': sort = sortBy compare 
  • क्यों नहीं ghc प्रकार ghc Ord a => [a] -> [a] sort लिए उपयोग करने में समर्थ नहीं है?
  • और क्यों ghc plus और plus' अलग तरह का इलाज करता है? plus में बहुरूपिक प्रकार का नाम होना चाहिए Num a => a -> a -> a और मैं वास्तव में नहीं देखता कि यह कैसे प्रकार के sort से अलग है और अभी तक केवल एक त्रुटि एक त्रुटि उठाती है

आखिरी बात: अगर मैं फ़ाइल को संकलित करने की परिभाषा टिप्पणी करता हूं हालांकि अगर मैं इसे ghci में लोड करने का प्रयास करता हूं और मुझे मिलते हैं, तो प्रकारों की जांच करें:

 *TestMono> :t plus plus :: Integer -> Integer -> Integer *TestMono> :t plus' plus' :: Num a => a -> a -> a 

plus पॉलीमोर्फ़िक का प्रकार क्यों नहीं है?


मेटा प्रश्न में चर्चा के रूप में यह हास्केल में मोनोमोर्फिज़्म प्रतिबंध के बारे में विहित प्रश्न है ।

वेब के समाधान से एकत्रित समाधान "Monomorphism प्रतिबंध क्या है?"