यदि हम प्रकारों की तुलना करते हैं
(<*>) :: Applicative a => a (s -> t) -> a s -> a t
(>>=) :: Monad m => m s -> (s -> m t) -> m t
हमें दो अवधारणाओं को अलग करने का एक संकेत मिलता है। यह दर्शाता है कि (s -> m t)
किस प्रकार के (>>=)
मूल्य में s
गणना का व्यवहार निर्धारित किया जा सकता है m t
। मोनाड्स मूल्य और गणना परतों के बीच हस्तक्षेप की अनुमति देते हैं। (<*>)
ऑपरेटर ऐसी कोई हस्तक्षेप की अनुमति देता है: समारोह और तर्क संगणना मूल्यों पर निर्भर नहीं है। यह वास्तव में काटता है। तुलना
miffy :: Monad m => m Bool -> m x -> m x -> m x
miffy mb mt mf = do
b <- mb
if b then mt else mf
जो दो संगणनाओं (जैसे प्रक्षेपास्त्रों को प्रक्षेपित करने और युद्धविराम पर हस्ताक्षर करने) के बीच निर्णय लेने के लिए कुछ प्रभाव के परिणाम का उपयोग करता है , जबकि
iffy :: Applicative a => a Bool -> a x -> a x -> a x
iffy ab at af = pure cond <*> ab <*> at <*> af where
cond b t f = if b then t else f
जो दो संगणना के मूल्यों केab
बीच चयन करने के लिए मूल्य का उपयोग करता है और दोनों को, शायद दुखद प्रभाव के लिए किया जाता है।at
af
मानादिक संस्करण (>>=)
एक मूल्य से एक संगणना चुनने के लिए अतिरिक्त शक्ति पर अनिवार्य रूप से निर्भर करता है , और यह महत्वपूर्ण हो सकता है। हालाँकि, उस शक्ति का समर्थन करने से भिक्षुओं की रचना कठिन हो जाती है। अगर हम 'डबल-बाइंड' बनाने की कोशिश करते हैं
(>>>>==) :: (Monad m, Monad n) => m (n s) -> (s -> m (n t)) -> m (n t)
mns >>>>== f = mns >>-{-m-} \ ns -> let nmnt = ns >>= (return . f) in ???
हमें यह बहुत दूर लगता है, लेकिन अब हमारी परतें पूरी तरह से टूट चुकी हैं। हमारे पास एक है n (m (n t))
, इसलिए हमें बाहरी से छुटकारा पाने की आवश्यकता है n
। जैसा कि अलेक्जेंड्रे सी कहते हैं, हम कर सकते हैं कि अगर हमारे पास एक उपयुक्त है
swap :: n (m t) -> m (n t)
n
अंदर की ओर और join
दूसरे को अनुमति देने के लिए n
।
कमजोर 'डबल-अप' को परिभाषित करना बहुत आसान है
(<<**>>) :: (Applicative a, Applicative b) => a (b (s -> t)) -> a (b s) -> a (b t)
abf <<**>> abs = pure (<*>) <*> abf <*> abs
क्योंकि परतों के बीच कोई हस्तक्षेप नहीं है।
इसके विपरीत, यह पहचानना अच्छा है जब आपको वास्तव में Monad
एस की अतिरिक्त शक्ति की आवश्यकता होती है , और जब आप कठोर गणना संरचना का Applicative
समर्थन कर सकते हैं।
ध्यान दें, वैसे, हालांकि मठों की रचना करना मुश्किल है, यह आपकी ज़रूरत से ज़्यादा हो सकता है। प्रकार -effects के m (n v)
साथ कंप्यूटिंग को इंगित करता है m
, फिर n
-values के साथ -value करने के लिए कंप्यूटिंग करता है v
, जहां -effects प्रारंभ m
होने से पहले समाप्त हो जाता है n
(इसलिए इसके लिए आवश्यकता है swap
)। यदि आप m
-effects के साथ बस इंटरलेवेव करना चाहते हैं n
, तो रचना शायद पूछना बहुत ज्यादा है!