मानसिक रूप से प्रयास करें (या एक पाठ संपादक के साथ) प्रकार आप उदाहरण में उपयोग किया है के साथ वर्ग परिभाषा में दिए गए प्रकार में भरने।
से:
class Print a where
print :: a -> String
और
data A t = A t
हम
instance Print A
तो चाहते हैं, A
हम कह रहे हैं के लिए प्रकार वर्ग परिभाषा a
प्रतिस्थापन एक instnace है, हमें यह मिलता है:
class Print A where
print :: A -> String
उह-ओह। A -> String
एक प्रकार के रूप में समझ में नहीं आता है, क्योंकि फ़ंक्शन प्रकार तीर बाईं ओर एक प्रकार और दाईं ओर एक प्रकार लेता है, और आपको फ़ंक्शन प्रकार देता है। लेकिन A
एक प्रकार नहीं है, क्योंकि आपने को data A t
के साथ घोषित किया है; A t
किसी भी प्रकार के t
के लिए एक प्रकार है, लेकिन A
एक प्रकार का निर्माता है। यदि आप इसे किसी प्रकार पर लागू करते हैं तो यह एक प्रकार का बना सकता है, लेकिन A
स्वयं कुछ अलग है। तो आप Print
के उदाहरण में A t
बना सकते हैं, लेकिन A
स्वयं नहीं।
तो instance Functor IO
क्यों काम किया? चलो वर्ग परिभाषा को देखो:
class Functor f where
fmap :: (a -> b) -> f a -> f b
अब f
के लिए IO
प्रतिस्थापन की कोशिश कर सकते हैं:
class Functor IO where
fmap :: (a -> b) -> IO a -> IO b
IO
अंत तक मापदंडों टाइप करने के लिए लागू किया जाता है, तो यह सब बाहर काम करता है। अगर हम Int
या A t
जैसेका एक ठोस प्रकार बनाने की कोशिश करते हैं तो हम समस्याओं में भाग लेंगे।