2016-07-16 11 views
6

एक बात मैंने देखी थी कि 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') 

तो क्यों वर्तमान में ऐसा होता है कि नहीं है?

+6

मुझे लगता है कि यह 'ghc-8.1' -' ghci' 'के साथ नया है।' उदाहरण 'मोनॉयड ए => मोनाड ((,) ए) -' जीएचसी.बेस 'में परिभाषित – Michael

+0

एक जंगली अनुमान: क्योंकि यह' सामान्य नहीं है? यह कारण हो सकता है कि 'सेट' में कोई नहीं है ... – ThreeFx

+1

' सेट' में कोई मोनैड इंस्टेंस नहीं है क्योंकि कोई उदाहरण मौजूद नहीं है जो मोनैड कानूनों को पूरा करता है। प्रस्तावित उदाहरण के लिए '((,) ए)' कानून पालन करने वाला है, और मुझे लगता है कि यह एकमात्र संभावित कानून-पालन करने वाला उदाहरण है, इसलिए इसे बनाने के लिए यह समझ में आता है। – amalloy

उत्तर

1

वैसे ऐसा लगता है कि इस सवाल का जवाब यह है कि मुझे केवल ghc-8.0.1 का उपयोग करना है, जो TupleMonad उदाहरण देता है। इसे इंगित करने के लिए @ माइकल को क्रेडिट करें।

+1

'8.1' अभी तक बाहर नहीं है; उसका मतलब '8.0.1' था। उदाहरण [यहां] पाया जा सकता है (https://hackage.haskell.org/package/base-4.9.0.0/docs/Control-Monad.html#control.i:ic:Monad:Monad:25)। – crockeea

+0

@ एरिक आह ठीक है, धन्यवाद! – semicolon

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