2012-06-12 15 views
21

मैं हास्केल सीख रहा हूं, और जब मैं कुछ परेशान हो गया तो मैं ghci में चारों ओर खेल रहा था।इस ghci सत्र में किस प्रकार के साथ चल रहा है?

सबसे पहले, एक सरल ऐड समारोह बनाने के लिए:

Prelude> let add x y = x + y 

ध्यान दें कि यह ints के साथ काम करता है और तैरता:

Prelude> add 3 4 
7 
Prelude> add 2.5 1.3 
3.8 

अब एक लागू समारोह पैदा करते हैं। यह $ (लेकिन इन्फिक्स नहीं) के समान है। यह ऐड पर नो-सेशन की तरह काम करता है:

Prelude> let apply f x = f x 
Prelude> apply add 3 4 
7 
Prelude> apply add 2.5 1.3 
3.8 

ठीक है, अब add' जो एक ही है add' के रूप में है, लेकिन apply का उपयोग कर:

Prelude> let add' = apply add 
Prelude> add' 3 4 
7 
Prelude> add' 2.5 1.3 

<interactive>:1:9: 
    No instance for (Fractional Integer) 
     arising from the literal `1.3' at <interactive>:1:9-11 
    Possible fix: add an instance declaration for (Fractional Integer) 
    In the second argument of `add'', namely `1.3' 
    In the expression: add' 2.5 1.3 
    In the definition of `it': it = add' 2.5 1.3 

वाट।

Prelude> :t add 
add :: (Num a) => a -> a -> a 
Prelude> :t apply add 
apply add :: (Num t) => t -> t -> t 
Prelude> :t add' 
add' :: Integer -> Integer -> Integer 
Prelude> 

क्यों add'apply add तुलना में एक अलग प्रकार है:

यहाँ प्रकार के होते हैं?

क्या यह एक ghci विषमता है, या यह सामान्य रूप से हास्केल में सच है? (और मैं अंतर कैसे बता सकता हूं?)

+13

जैसे ही मैं सुनता हूं "मैं ghci में खेल रहा था और मैंने कुछ अजीब देखा," मुझे लगता है कि "मोनोमोर्फिज्म प्रतिबंध" – amindfv

उत्तर

18

यह Monomorphism restriction है। जब आप एक साधारण पैटर्न बाध्यकारी (केवल नाम, बिना किसी फ़ंक्शन तर्क के) के मान को परिभाषित करते हैं और बिना किसी प्रकार के हस्ताक्षर के, यह एक मोनोमोर्फिक प्रकार प्राप्त करता है। defaulting rules के अनुसार किसी भी प्रकार के चर को असंबद्ध करने की कोशिश की जाती है, यदि यह सफल नहीं होता है तो आपको एक प्रकार की त्रुटि मिलती है।

इस मामले में, Num अवरुद्ध प्रकार परिवर्तक Integer पर डिफ़ॉल्ट हो जाता है।

आप

ghci> :set -XNoMonomorphismRestriction 

साथ या कमांड लाइन पर -XnoMonomorphismRestriction ध्वज के साथ monomorphism प्रतिबंध बंद कर सकते हैं।

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