हैं एक प्रकार m :: * -> *
में Monad
उदाहरण है, आपको a -> m b
प्रकार के साथ फ़ंक्शंस की ट्यूरिंग-पूर्ण संरचना मिलती है। यह एक शानदार रूप से उपयोगी संपत्ति है। आपको विभिन्न ट्यूरिंग-पूर्ण नियंत्रण को अमूर्त करने की क्षमता विशिष्ट अर्थों से दूर बहती है। यह एक न्यूनतम संरचना पैटर्न है जो इसका समर्थन करने वाले प्रकारों के साथ काम करने के लिए किसी भी नियंत्रण प्रवाह को सारणीकरण का समर्थन करता है।
उदाहरण के लिए, Applicative
पर इसकी तुलना करें। वहां, आपको पुश-डाउन automaton के समतुल्य कम्प्यूटेशनल पावर के साथ केवल रचना पैटर्न मिलते हैं। बेशक, यह सच है कि अधिक सीमित शक्ति के साथ अधिक प्रकार का समर्थन संरचना। और यह सच है कि जब आप उपलब्ध बिजली को सीमित करते हैं, तो आप अतिरिक्त अनुकूलन कर सकते हैं। इन दो कारणों से Applicative
कक्षा मौजूद है और उपयोगी है। लेकिन चीजें जो Monad
के उदाहरण हो सकती हैं, आमतौर पर प्रकार के उपयोगकर्ता इस प्रकार के साथ सबसे सामान्य संचालन कर सकते हैं।
संपादित करें: लोकप्रिय मांग करके, यहाँ कुछ Monad
वर्ग का उपयोग कर कार्य हैं:
ifM :: Monad m => m Bool -> m a -> m a -> m a
ifM c x y = c >>= \z -> if z then x else y
whileM :: Monad m => (a -> m Bool) -> (a -> m a) -> a -> m a
whileM p step x = ifM (p x) (step x >>= whileM p step) (return x)
(*&&) :: Monad m => m Bool -> m Bool -> m Bool
x *&& y = ifM x y (return False)
(*||) :: Monad m => m Bool -> m Bool -> m Bool
x *|| y = ifM x (return True) y
notM :: Monad m => m Bool -> m Bool
notM x = x >>= return . not
के साथ उन लोगों का मेल करना वाक्य रचना (या कच्चे >>=
ऑपरेटर) आप बाध्यकारी नाम देता है, अनिश्चितकालीन पाशन, और पूर्ण बूलियन तर्क। यह ट्यूरिंग पूर्णता देने के लिए पर्याप्त प्राइमेटिव का एक प्रसिद्ध सेट है। ध्यान दें कि सरल मूल्यों के बजाय, मोनाडिक मानों पर काम करने के लिए सभी कार्यों को कैसे हटाया गया है। सभी monadic प्रभाव केवल तभी बंधे होते हैं जब केवल ifM
की चुनी हुई शाखा के प्रभाव इसके अंतिम मूल्य में बंधे होते हैं। *&&
और *||
दोनों संभव होने पर उनके दूसरे तर्क को अनदेखा करते हैं। और इतने पर ..
अब, उन प्रकार के हस्ताक्षर में प्रत्येक monadic ऑपरेंड के लिए कार्यों को शामिल नहीं किया जा सकता है, लेकिन यह सिर्फ एक संज्ञानात्मक सरलीकरण है।बोतलों को अनदेखा करते हुए कोई अर्थपूर्ण अंतर नहीं होगा, यदि सभी गैर-कार्य तर्क और परिणाम में बदल दिए गए थे। उपयोगकर्ताओं को उस संज्ञानात्मक ओवरहेड को अनुकूलित करने के लिए यह सिर्फ मित्रवत है।
अब, देखते हैं कि Applicative
इंटरफ़ेस के साथ उन कार्यों के साथ क्या होता है।
ifA :: Applicative f => f Bool -> f a -> f a -> f a
ifA c x y = (\c' x' y' -> if c' then x' else y') <$> c <*> x <*> y
ठीक है, ओह। यह एक ही प्रकार के हस्ताक्षर मिला। लेकिन यहां पहले से ही एक बड़ी समस्या है। एक्स और वाई दोनों के प्रभाव रचनात्मक संरचना में बंधे हैं, भले ही किसी का मूल्य चुना गया हो।
whileA :: Applicative f => (a -> f Bool) -> (a -> f a) -> a -> f a
whileA p step x = ifA (p x) (whileA p step <$> step x) (pure x)
ठीक है, ठीक है, कि जैसे कि यह ठीक हो जाएगा तथ्य यह है कि यह एक अनंत लूप है, क्योंकि ifA
हमेशा दोनों शाखाओं को निष्पादित करेंगे ... सिवाय यह भी है कि बंद नहीं है के अलावा लगता है। pure x
में f a
है। whileA p step <$> step x
में f (f a)
है। यह एक अनंत लूप भी नहीं है। यह संकलन त्रुटि है। आइए पुनः प्रयास करें ..
whileA :: Applicative f => (a -> f Bool) -> (a -> f a) -> a -> f a
whileA p step x = ifA (p x) (whileA p step <*> step x) (pure x)
अच्छी तरह से शूट करें। अब तक भी मत जाओ। whileA p step
में a -> f a
है। यदि आप इसे <*>
के पहले तर्क के रूप में उपयोग करने का प्रयास करते हैं, तो शीर्ष प्रकार कन्स्ट्रक्टर के लिए , f
पर Applicative
उदाहरण प्राप्त करता है। हाँ, यह या तो काम नहीं करेगा।
वास्तव में, मेरे Monad
उदाहरणों का एकमात्र कार्य Applicative
इंटरफेस के साथ काम करेगा notM
। यह विशेष कार्य वास्तव में केवल Functor
इंटरफ़ेस के साथ ठीक काम करता है। बाकी? वे असफल हैं।
बेशक यह उम्मीद की जा सकती है कि आप Monad
इंटरफ़ेस का उपयोग करके कोड लिख सकते हैं कि आप Applicative
इंटरफ़ेस के साथ नहीं कर सकते हैं। यह सब के बाद सख्ती से अधिक शक्तिशाली है। लेकिन दिलचस्प क्या है जो आप खो देते हैं। आप उन कार्यों को लिखने की क्षमता खो देते हैं जो उनके इनपुट पर आधारित प्रभावों को बदलते हैं। यही है, आप कुछ नियंत्रण-प्रवाह पैटर्न लिखने की क्षमता खो देते हैं जो a -> f b
प्रकारों के साथ फ़ंक्शंस लिखते हैं।
ट्यूरिंग-पूर्ण संरचना बिल्कुलMonad
इंटरफ़ेस दिलचस्प बनाता है। यदि यह ट्यूरिंग-पूर्ण संरचना की अनुमति नहीं देता है, तो प्रोग्रामर, आपके लिए किसी भी विशेष नियंत्रण प्रवाह में IO
क्रियाओं को एक साथ लिखना असंभव होगा, जो आपके लिए अच्छी तरह से प्रीपेक नहीं किया गया था। यह तथ्य था कि आप प्राइमेटिव्स का उपयोग को नियंत्रण प्रवाह को व्यक्त करने के लिए कर सकते हैं जिससे IO
हास्केल में आईओ समस्या का प्रबंधन करने के लिए एक व्यवहार्य तरीका टाइप करें।
IO
से कई और प्रकार पहले से ही Monad
इंटरफेस मान्य हैं। और ऐसा होता है कि पूरे इंटरफ़ेस पर हास्केल की भाषा सुविधाएं हैं। उन कारकों के कारण, Monad
, जब संभव हो, उदाहरण प्रदान करने के लिए एक मूल्यवान वर्ग है। ऐसा करने से आपको ठोस प्रकार के साथ काम करने के बावजूद, मोनैडिक प्रकारों के साथ काम करने के लिए प्रदान की गई सभी मौजूदा सार कार्यक्षमता तक पहुंच प्राप्त होती है।
तो यदि हास्केल प्रोग्रामर हमेशा Monad
किसी प्रकार के उदाहरणों की देखभाल करते हैं, तो ऐसा इसलिए होता है क्योंकि यह सबसे सामान्य रूप से उपयोगी उदाहरण प्रदान किया जा सकता है।
एह, मुझे आपके आधार के बारे में निश्चित नहीं है: अधिक से अधिक उन्नत हास्केलर्स मुझे कुछ डिग्री के लिए आवेदन के पक्ष में पता है। मैं निश्चित रूप से कर दूंगा। लोग पूरी तरह से असंबंधित कार्यों के लिए हर समय मोनोइड्स का उपयोग करते हैं। थोड़ी देर में श्रेणियां भी एक बार आती हैं। किसी भी कारण से, मोनाड्स को गैर-हास्केल-सर्किट सर्किट में बहुत सारी प्रेस मिलती है। –
@ टिखोन जेल्विस: मुझे नहीं लगता कि "अधिक से अधिक उन्नत हास्केलर्स मुझे कुछ डिग्री के लिए आवेदन के पक्ष में पता है।" जिन चीजों को मैं सबसे अधिक ध्यान में देख रहा हूं वे विशेष रूप से आवेदक से संबंधित नहीं हैं। एक उदाहरण के रूप में, [जिस पर मैं काम कर रहा हूं] (http://hackage.haskell.org/package/free-operational) का उपयोग करने के लिए, मैं न्याय करता हूं कि मुफ़्त मोनैड अभी भी नि: शुल्क आवेदकों की तुलना में अधिक ब्याज का आदेश देते हैं। हालांकि, नि: शुल्क आवेदकों पर ब्याज हाल ही में बढ़ रहा है। –
जहां तक मुझे याद है, मोडैड को वाडलर द्वारा लोकप्रिय किया गया था, और उस समय आईओओ को थकाऊ सीपीएस के बिना और स्पष्ट राज्य गुजरने के बिना पार्सिंग का विचार भारी बिकने वाले अंक थे; यह एक बेहद रोमांचक समय था। एएफएआईआईआर, हास्केल ने कन्स्ट्रक्टर कक्षाएं नहीं कीं, लेकिन गोफर (हग्स के पिता) ने किया। वाडलर ने मोनैड के लिए ओवरलोडिंग सूची समझ का प्रस्ताव दिया, इसलिए बाद में नोटेशन आया। एक बार आईओ monadic था, monads शुरुआती के लिए एक बड़ा सौदा बन गया, उन्हें grok करने के लिए एक प्रमुख बात के रूप में cementing। जब आप कर सकते हैं तो आवेदन बहुत अच्छे होते हैं, और तीर अधिक सामान्य होते हैं, लेकिन वे बाद में आए, और आईओ मोनैड को बेचता है। – AndrewC