टाइपराइक्सेस MonadPlus, वैकल्पिक और Monoid के बीच अंतर?


83

मानक-पुस्तकालय हास्केल टाइपकास्टेस MonadPlus, Alternativeऔर Monoidप्रत्येक अनिवार्य रूप से एक ही शब्दार्थ के साथ दो तरीके प्रदान करते हैं:

  • एक खाली मूल्य: mzero, empty, या mempty
  • एक ऑपरेटर a -> a -> aहै कि एक साथ typeclass में मानों मिलती है: mplus, <|>, या mappend

तीनों इन कानूनों को निर्दिष्ट करते हैं कि किन उदाहरणों का पालन करना चाहिए:

mempty `mappend` x = x
x `mappend` mempty = x

इस प्रकार, ऐसा लगता है कि तीन टाइपकास्ट सभी एक ही तरीके प्रदान कर रहे हैं ।

( Alternativeयह भी प्रदान करता है someऔर many, लेकिन उनकी डिफ़ॉल्ट परिभाषा आमतौर पर पर्याप्त होती है, और इसलिए वे इस प्रश्न के संदर्भ में बहुत महत्वपूर्ण नहीं हैं।)

तो, मेरी क्वेरी है: इन तीनों को समान वर्गों में क्यों रखा गया है? क्या उनके अलग-अलग सुपरक्लास बाधाओं के अलावा, उनके बीच कोई वास्तविक अंतर है?


यह एक अच्छा सवाल है। विशेष रूप से, Applicativeऔर बिल्कुल एक जैसे MonadPlusलगते हैं (मोडुलो सुपरक्लास बाधाएं)।
पीटर

1
वहाँ भी है ArrowZeroऔर ArrowPlusतीर के लिए। मेरी शर्त: प्रकार के हस्ताक्षर क्लीनर बनाने के लिए (जो अलग-अलग सुपरक्लास वास्तविक अंतर को विवश करता है )।
कैट प्लस प्लस

2
@CatPlusPlus: ठीक है, ArrowZeroऔर ArrowPlusप्रकार है * -> * -> *, जिसका अर्थ है आप एक बार एक समारोह है कि जरूरतों को उन्हें प्रकार की एक भीड़ के लिए उपयोग करने के लिए, एक का उपयोग करने के लिए तीर प्रकार के लिए में उन्हें पारित कर सकते हैं Monoidआप चाहते हैं है का एक उदाहरण की आवश्यकता के लिए Monoidप्रत्येक विशेष के लिए तात्कालिकता, और आपके पास कोई गारंटी नहीं होगी कि वे एक समान तरीके से नियंत्रित किए गए थे, उदाहरण असंबद्ध हो सकते हैं!
एडवर्ड केमेट

जवाबों:


120

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हो सकता है (और कभी-कभी) कुछ पूरी तरह से अलग है।


2
उत्कृष्ट उत्तर, हालांकि अंतिम परिभाषा गलत प्रतीत होती है, यह संतुष्ट नहीं करता है mempty `mappend` x ≡ x
वितुस

2
बहुत बढ़िया जवाब। क्या किसी को (आमतौर पर इस्तेमाल किए जाने वाले) प्रकार के बारे में पता है जिसमें भिन्न MonadPlus और Alternativeकार्यान्वयन हैं?
पीटर

7
@EdwardKmett: इस उत्तर का अर्थ यह लगता है कि ऐसा हो सकता है Monadजो एक है, Alternativeलेकिन नहीं MonadPlus। मैंने इसका एक विशिष्ट उदाहरण खोजने के बारे में एक प्रश्न पूछा ; यदि आप एक के बारे में जानते हैं, तो मुझे यह देखना अच्छा लगेगा।
एंटाल स्पेक्टर-ज़बस्की

2
क्या आप मोनडप्लस के लिए लेफ्ट कैच कानून की व्याख्या कर सकते हैं? इसका स्पष्ट रूप से उल्लंघन किया जाता है []; क्या [] वास्तव में इसके दूसरे तर्क को अनदेखा करना चाहिए यदि इसका पहला गैर-खाली है?
बेन डब्ल्यू

4
@ छोड़ दिया वितरण यकीनन अधिक समझदार कानून है, लेकिन यह कुछ उदाहरणों के लिए नहीं है। लेफ्ट कैच एक वैकल्पिक कानून है जिसका अन्य उदाहरण समर्थन करते हैं, लेकिन जो अन्य लोगों द्वारा समर्थित नहीं हैं। नतीजतन, हम वास्तव में कानूनों के 2 बड़े पैमाने पर असंबंधित सेट हैं जो विभिन्न उदाहरणों द्वारा कार्यान्वित किए जा रहे हैं, इसलिए MonadPlusवास्तव में दो वर्ग एक के रूप में प्रच्छन्न हैं क्योंकि अधिकांश लोग परवाह नहीं करते हैं।
एडवर्ड केमेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.