LYAH पढ़ना, मैं कोड के इस टुकड़े पर ठोकर खाई:क्या उच्च आदेश polymorphism तर्क के सख्त आदेश की आवश्यकता है?
newtype Writer w a = Writer { runWriter :: (a, w) }
instance (Monoid w) => Monad (Writer w) where
return x = Writer (x, mempty)
(Writer (x,v)) >>= f = let (Writer (y, v')) = f x in Writer (y, v `mappend` v')
को समझने के लिए क्या बिल्ली पहली पंक्ति में Writer w
है प्रयास करते समय, मुझे पता चला यह एक पूर्ण प्रकार नहीं किया जा रहा है, लेकिन साथ प्रकार निर्माता का एक प्रकार 1 तर्क, के लिए Maybe String
Maybe
जैसे महान लग रहा है, लेकिन क्या हुआ अगर प्रारंभिक प्रकार यदि Writer'
इस तरह, बदली प्रकार तर्क के साथ परिभाषित किया गया है:
newtype Writer' a w = Writer' { runWriter :: (a, w) }
क्या अब मोनाड इंस्टेंस को कार्यान्वित करना संभव है? कुछ इस तरह है, लेकिन क्या वास्तव में संकलित किया जा सकता है: एक प्रकार तर्क गुम साथ एक प्रकार निर्माता - इस समय पहले एक:
instance (Monoid w) => Monad (\* -> Writer' * monoid) where
\* -> Writer' * monoid
के विचार एक ही रूप में Writer w
है।
आप 'मोनाड' उदाहरण रखने के स्पष्ट उद्देश्य के लिए 'राइटर' को परिभाषित करते हैं। स्वैच्छिक तर्कों के साथ इसे परिभाषित करने का कोई मतलब नहीं है। और यदि आप निर्णायक प्रकार की जांच करना चाहते हैं तो आप इस प्रकार के स्तर के कार्यों को नहीं लिख सकते हैं। –