2011-06-12 3 views
10
import Data.List (genericLength) 

len = genericLength 

:t genericLength 
genericLength :: (Num i) => [b] -> i 
:t len 
len :: [b] -> Integer 

len का प्रकार genericLength के प्रकार से अलग क्यों है? यहां इरादा genericLength के लिए एक छोटे उपनाम का उपयोग करना है।फ़ंक्शन नाम के लिए उपनाम में एक अलग प्रकार का हस्ताक्षर है। क्यूं कर?

हैकेल में प्रथम श्रेणी का कार्य नहीं कर रहे हैं? फ़ंक्शन परिणाम के लिए एक समान फ़ंक्शन में कोई दूसरा नाम नहीं देना चाहिए?

+5

मुझे उत्तर पोस्ट करने के लिए इसके बारे में पर्याप्त जानकारी नहीं है, लेकिन मुझे पूरा यकीन है कि इसमें [मोनोमोर्फिज्म प्रतिबंध] (http://www.haskell.org/haskellwiki/Monomorphism_restriction) के साथ कुछ करना है। यदि आप फ़ाइल के शीर्ष पर '{- # LANGUAGE NoMonomorphismRestriction # -} 'डालते हैं, तो यह वैसे ही व्यवहार करेगा जिसकी आप अपेक्षा करते हैं। –

+0

+1 जेफरी को यह कहने के लिए कि यह मोनोमोर्फिज्म प्रतिबंध से संबंधित है। –

उत्तर

11

क्या आप यहाँ देख रहे हैं क्योंकि एक आवश्यकता है कि कोई तर्क के साथ शीर्ष स्तर के घोषणाओं monomorphic हो की है। आप some discussion of the reasons for this on the Haskell wiki, और जीएचसी उपयोगकर्ता की मार्गदर्शिका में controlling this behavior के बारे में कुछ जानकारी पा सकते हैं।

चित्रण के रूप में, ध्यान दें कि len दे रही है एक तर्क समस्या का समाधान होता:

len x = genericLength x 

> :t len 
len :: Num i => [b] -> i 

तो यह एक प्रकार हस्ताक्षर दे रही है:

len :: (Num b) => [a] -> b 
len = genericLength 

और इसलिए monomorphism प्रतिबंध को बंद करने देता है:

{-# LANGUAGE NoMonomorphismRestriction #-} 
import Data.List (genericLength) 

len = genericLength 

> :t len 
len :: Num i => [b] -> i 

इस विशिष्ट मामले में, मुझे लगता है कि आप भी एक अलग हो रहे हैं डिफ़ॉल्ट रूप से निर्दिष्ट करने के कारण एंटी प्रकार (एक कंपाइलर त्रुटि के बजाए) निर्दिष्ट करता है कि निर्दिष्ट प्रकार वर्गों को विशिष्ट प्रकारों के लिए डिफ़ॉल्ट होना चाहिए (इस मामले में, NumInteger पर डिफ़ॉल्ट है। आप fmap साथ ही बात कर प्रयास करते हैं तो आप इस मिल:

> :r 
[1 of 1] Compiling Main    (MonoTest.hs, interpreted) 

MonoTest.hs:4:5: 
    Ambiguous type variable `f0' in the constraint: 
     (Functor f0) arising from a use of `fmap' 
    Possible cause: the monomorphism restriction applied to the following: 
     f :: forall a b. (a -> b) -> f0 a -> f0 b 
     (bound at MonoTest.hs:4:1) 
    Probable fix: give these definition(s) an explicit type signature 
        or use -XNoMonomorphismRestriction 
    In the expression: fmap 
    In an equation for `f': f = fmap 
Failed, modules loaded: none. 

आप Haskell 98 Report में दोषी बारे में कुछ जानकारी पा सकते हैं। मैं यह भी उल्लेख करूंगा कि जीएचसी डिफ़ॉल्ट रूप से जीएचसीआई (और डिफ़ॉल्ट रूप से सक्षम है) के लिए उपयोग किया जाता है, जो कभी-कभी लोगों को भ्रमित करता है।

+1

धन्यवाद, एफआई = इंटेग्रल से वही सोच रहा था। – gorlum0

+2

@ gorlum0: हाहाहाहा, monomorphism और डिफ़ॉल्ट निश्चित रूप से उस समारोह * विशेष रूप से * अनुपयोगी बनाते हैं। –

+1

ध्यान दें कि जीएचसी 7.8 से अब और नहीं होना चाहिए क्योंकि "जीएचसीआई में डिफ़ॉल्ट रूप से मोनोमोर्फिज्म प्रतिबंध अब बंद हो गया है"। (Https://downloads.haskell.org/~ghc/7.8.1-rc1/docs/html/users_guide/release-7-8-1.html) – thoferon

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