एक बात मैंने देखी थी कि Tuple
में Monad
उदाहरण नहीं है।ट्यूपल के पास मोनाड उदाहरण क्यों नहीं है?
instance Monoid a => Applicative ((,) a)
कौन सा पहले से ही अत्यंत भारी प्रतिबंधित करता है कि हम क्या Monad
उदाहरण होना कर सकते हैं:
टपल लेकिन एक Applicative
उदाहरण है।
instance Monoid a => Monad ((,) a)
join :: Monad m => m (m a) -> m a
join :: Monoid a => (a, (a, b)) -> (a, b)
हम भी इकाई कानूनों देख सकते हैं::
प्रकार हस्ताक्षर पर देखने में शामिल होने के लिए हम मिलेगा चलें
join $ f <$> pure x == f x
join $ f <$> (mempty, x) == f x
join (mempty, f x) == f x
join (mempty, (a, b)) == (a, b)
join $ pure <$> x = x
join $ pure <$> (a, b) = (a, b)
join (a, (mempty, b)) = (a, b)
इस बिंदु पर हम जानते हैं कि में mempty
और x
संयोजन किसी भी तरह से x
में परिणाम। और हमारे पास x
के बारे में एकमात्र प्रकार की जानकारी है कि यह Monoid
है। तो मूल रूप से केवल दो कार्यान्वयन हैं:
join (a, (b, x)) = (a <> b, x)
और:
join (a, (b, x)) = (b <> a, x)
और उन बनाता ap
और <*>
ही नहीं की दूसरी एक।
तो अब हम जानते हैं कि ((,) a)
के लिए ही मान्य Monad
उदाहरण है:
instance Monoid a => Monad ((,) a) where
(a, c) >>= f = let (b, c') = f c in (a <> b, c')
तो क्यों वर्तमान में ऐसा होता है कि नहीं है?
मुझे लगता है कि यह 'ghc-8.1' -' ghci' 'के साथ नया है।' उदाहरण 'मोनॉयड ए => मोनाड ((,) ए) -' जीएचसी.बेस 'में परिभाषित – Michael
एक जंगली अनुमान: क्योंकि यह' सामान्य नहीं है? यह कारण हो सकता है कि 'सेट' में कोई नहीं है ... – ThreeFx
' सेट' में कोई मोनैड इंस्टेंस नहीं है क्योंकि कोई उदाहरण मौजूद नहीं है जो मोनैड कानूनों को पूरा करता है। प्रस्तावित उदाहरण के लिए '((,) ए)' कानून पालन करने वाला है, और मुझे लगता है कि यह एकमात्र संभावित कानून-पालन करने वाला उदाहरण है, इसलिए इसे बनाने के लिए यह समझ में आता है। – amalloy