2017-05-01 6 views
8

यह शायद एक बेवकूफ सवाल यह है की एक उपयोग से उत्पन्न होने अनुमान नहीं किया जा सका, लेकिन क्यों इस समारोह(घिरा A1) 'minBound'

myTest :: (Bounded a) => a 
myTest = minBound :: a 

typecheck नहीं करता है?

यह

myTest' :: Int 
myTest' = minBound :: Int 

काम करता है और वे यह काम करने के लिए आपको मेरे लिए एक ही लगता है, सिवाय इसके कि एक पूर्व टाइप करने के लिए होता है (जैसे myTest :: इंट)।

त्रुटि मैं

• Could not deduce (Bounded a1) arising from a use of ‘minBound’ 
    from the context: Bounded a 
    bound by the type signature for: 
       myTest :: Bounded a => a 

उत्तर

7

आप {-# LANGUAGE ScopedTypeVariables #-} का उपयोग कर, जो आप फ़ंक्शन हस्ताक्षर समारोह के भीतर की प्रकार चर का उपयोग करने की अनुमति देता ScopedTypeVariables सक्षम करना होगा है। तुम भी इस प्रकार अपने उदाहरण को बदलने के लिए की आवश्यकता होगी:

{-# LANGUAGE ScopedTypeVariables #-} 

myTest :: forall a. (Bounded a) => a 
myTest = minBound :: a 

forall गुंजाइश a को संकलक बताता है। डिफ़ॉल्ट (unscoped) व्यवहार के साथ कोई स्पष्ट forall वाली परिभाषाएं।

अन्यथा, समारोह के अंदर a एक अलग a (कंपाइलर द्वारा a1 में बदल गया है) मुख्य प्रकार के हस्ताक्षर में से एक की तुलना में एक अलग है। यह घटा नहीं सकता है कि a1 केवल संदर्भ से बढ़ा है कि कुछ अन्य प्रकार a बाध्य है।

दूसरा उदाहरण काम करता है क्योंकि Int एक प्रकार का चर नहीं है, यह एक ठोस प्रकार है, जिसका अर्थ है कि यह एक ही प्रकार को संदर्भित करता है चाहे इस प्रकार के प्रकार किस प्रकार के हैं या दायरे में नहीं हैं।

Further Reading

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