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लगते हैं (मोडुलो सुपरक्लास बाधाएं)।