MonadPlus
और Monoid
विभिन्न उद्देश्यों की पूर्ति करें।
A Monoid
को एक प्रकार के प्रकार से परिचालित किया जाता है *
।
class Monoid m where
mempty :: m
mappend :: m -> m -> m
और इसलिए इसे लगभग किसी भी प्रकार के लिए तत्काल किया जा सकता है जिसके लिए एक स्पष्ट ऑपरेटर है जो सहयोगी है और जिसकी एक इकाई है।
हालांकि, MonadPlus
न केवल यह निर्दिष्ट करता है कि आपके पास एक मोनॉइडल संरचना है, बल्कि यह भी कि वह संरचना संबंधित है कि कैसे Monad
कार्य करता है, और यह कि संरचना मोनाड में निहित मूल्य के बारे में परवाह नहीं करती है, यह (भाग में) तथ्य से संकेत मिलता है यह MonadPlus
एक तरह का तर्क लेता है * -> *
।
class Monad m => MonadPlus m where
mzero :: m a
mplus :: m a -> m a -> m a
मोनॉइड कानूनों के अलावा, हमारे पास कानूनों के दो संभावित सेट हैं जिन्हें हम लागू कर सकते हैं MonadPlus
। अफसोस की बात है कि समुदाय इस बात से असहमत है कि उन्हें क्या होना चाहिए।
कम से कम हम जानते हैं
mzero >>= k = mzero
लेकिन दो अन्य प्रतिस्पर्धी एक्सटेंशन हैं, बाएं (सिक) वितरण कानून
mplus a b >>= k = mplus (a >>= k) (b >>= k)
और बाएँ पकड़ कानून
mplus (return a) b = return a
तो किसी भी उदाहरण MonadPlus
को इन अतिरिक्त कानूनों में से एक या दोनों को संतुष्ट करना चाहिए।
तो किस बारे में Alternative
?
Applicative
के बाद परिभाषित किया गया था Monad
, और तार्किक रूप से एक सुपरक्लास के रूप में है Monad
, लेकिन मोटे तौर पर हास्केल 98 में डिजाइनरों पर अलग-अलग दबावों के कारण, यहां तक कि 2015 तक Functor
सुपरक्लास नहीं था Monad
। अब हम अंततः जीएचसी के Applicative
सुपरक्लास के रूप Monad
में हैं (यदि नहीं अभी तक एक भाषा मानक में।)
प्रभावी रूप से, Alternative
यह है Applicative
कि क्या MonadPlus
करना है Monad
।
इनके लिए हमें मिलेगा
empty <*> m = empty
हमारे पास जो MonadPlus
कुछ भी है उसके समान रूप से, समान वितरण और गुण मौजूद हैं, जिनमें से कम से कम आपको संतुष्ट होना चाहिए।
दुर्भाग्य से, यहां तक कि empty <*> m = empty
कानून भी बहुत मजबूत है। उदाहरण के लिए, यह पीछे की ओर नहीं है !
जब हम मोनाडप्लस को देखते हैं, तो खाली >> = f = खाली कानून लगभग हम पर मजबूर होता है। खाली निर्माण में किसी भी तरह से फ़ंक्शन को कॉल करने के लिए नहीं हो सकता है f
।
हालांकि, बाद से Applicative
है न की एक सुपर क्लास Monad
और Alternative
है नहीं की एक सुपर क्लास MonadPlus
, हम अलग से दोनों मामलों को परिभाषित हवा।
इसके अलावा, यहां तक कि अगर Applicative
एक सुपरक्लास था Monad
, तो आपको MonadPlus
क्लास की वैसे भी ज़रूरत होगी , क्योंकि अगर हमने आज्ञा का पालन किया
empty <*> m = empty
यह साबित करने के लिए पर्याप्त रूप से पर्याप्त नहीं है
empty >>= f = empty
इसलिए यह दावा करना कि कोई चीज MonadPlus
दावा करने से ज्यादा मजबूत है Alternative
।
अब, सम्मेलन द्वारा, MonadPlus
और Alternative
किसी दिए गए प्रकार के लिए सहमत होना चाहिए, लेकिन पूरी तरह से अलग Monoid
हो सकता है ।
उदाहरण के लिए MonadPlus
और Alternative
के लिए Maybe
स्पष्ट बात करते हैं:
instance MonadPlus Maybe where
mzero = Nothing
mplus (Just a) _ = Just a
mplus _ mb = mb
लेकिन Monoid
उदाहरण एक अर्धवृत्त एक में लिफ्ट करता है Monoid
। अफसोस की बात Semigroup
यह है कि हास्केल 98 में उस समय एक वर्ग मौजूद नहीं था , यह ऐसा ए-रेकरिंग द्वारा किया गया था Monoid
, लेकिन अपनी इकाई का उपयोग नहीं कर रहा था। ಠ_ಠ
instance Monoid a => Monoid (Maybe a) where
mempty = Nothing
mappend (Just a) (Just b) = Just (mappend a b)
mappend Nothing x = x
mappend x Nothing = x
mappend Nothing Nothing = Nothing
टीएल; डीआर MonadPlus
एक मजबूत दावा है Alternative
, जो बदले में एक मजबूत दावा है Monoid
, और जबकि एक प्रकार के लिए उदाहरण MonadPlus
और Alternative
संबंधित होना चाहिए, Monoid
हो सकता है (और कभी-कभी) कुछ पूरी तरह से अलग है।
Applicative
और बिल्कुल एक जैसेMonadPlus
लगते हैं (मोडुलो सुपरक्लास बाधाएं)।