अंगूठे का एक सहायक नियम है जब आप संदर्भ संदर्भ में देखते हैं;
- हो सकता है कि: monads पर "प्रभाव" लेयरिंग के रूप में देखा जा सकता है पक्षपात (उपयोग करता है: संगणना कि असफल हो सकता है)
- कोई एक: कम सर्किटिंग त्रुटियों (उपयोग करता है: त्रुटि/अपवाद हैंडलिंग)
- [] (सूची इकाई): nondeterminism (उपयोग करता है: सूची पीढ़ी, छानने, ...)
- राज्य: एक भी परिवर्तनशील संदर्भ (का उपयोग करता है: राज्य)
012,351,
- रीडर: एक साझा पर्यावरण (उपयोग करता है: चर बाइंडिंग, समान जानकारी, ...)
- लेखक: एक "पक्ष-चैनल" उत्पादन या संचय (उपयोग करता है: प्रवेश, काउंटर एक-केवल लिखने को बनाए रखने, ...)
- शेष भाग: गैर स्थानीय नियंत्रण प्रवाह (का उपयोग करता है: भी कई सूची)
आमतौर पर, आप आम तौर पर अपनी इकाई मानक Monad Transformer Library से इकाई ट्रांसफार्मर पर लेयरिंग द्वारा डिजाइन चाहिए, जो आपको उपर्युक्त प्रभाव को एक मो में जोड़ देता है नाद। साथ में, ये उन अधिकांश मोनैड को संभालते हैं जिन्हें आप उपयोग करना चाहते हैं। एमटीएल में शामिल कुछ अतिरिक्त मोनैड शामिल नहीं हैं, जैसे probability और supply मोनैड।
जहाँ तक कि क्या एक नव परिभाषित प्रकार एक इकाई है, और यह कैसे एक के रूप में व्यवहार करती है, आप से Functor
Monad
अप करने के लिए जा रहा द्वारा इसके बारे में सोच सकते हैं के लिए एक अंतर्ज्ञान के विकास के रूप में:
- functor आपको शुद्ध कार्यों के साथ मूल्यों को बदलने देता है।
- आवेदक आपको शुद्ध मूल्यों को एम्बेड करने और एप्लिकेशन को व्यक्त करने देता है -
(<*>)
आपको एक एम्बेडेड फ़ंक्शन और एम्बेडेड परिणाम से एम्बेडेड तर्क से जाने देता है।
- मोनाड एम्बेडेड कंप्यूटेशंस की संरचना पिछले कंप्यूटेशंस के मान पर निर्भर करता है।
इस को समझने के लिए सबसे आसान तरीका है join
के प्रकार को देखने के लिए है:
join :: (Monad m) => m (m a) -> m a
इसका मतलब यह है कि यदि आप एक एम्बेडेड गणना जिसका परिणाम एक नई एम्बेडेड गणना है है, तो आप बना सकते हैं एक गणना जो उस गणना के परिणाम निष्पादित करती है। तो आप पिछले गणना के मानों के आधार पर एक नई गणना बनाने के लिए मोनाडिक प्रभाव का उपयोग कर सकते हैं, और उस गणना में स्थानांतरण नियंत्रण प्रवाह। , Applicative
साथ, गणना की संरचना स्थिर है (यानी एक दिया Applicative
गणना प्रभाव की एक निश्चित संरचना है कि मध्यवर्ती मूल्यों के आधार पर बदल नहीं कर सकता है), जबकि:
दिलचस्प है, इस संरचना चीजों के एक कमजोरी monadically हो सकता है Monad
के साथ यह गतिशील है। यह आपके द्वारा किए जा सकने वाले अनुकूलन को प्रतिबंधित कर सकता है; उदाहरण के लिए, आवेदक पार्सर मोनैडिक से कम शक्तिशाली होते हैं (ठीक है, यह strictly true नहीं है, लेकिन यह प्रभावी रूप से है), लेकिन उन्हें बेहतर अनुकूलित किया जा सकता है।
ध्यान दें कि (>>=)
रूप
m >>= f = join (fmap f m)
परिभाषित किया जा सकता है और इसलिए एक इकाई return
और join
(यह मानते हुए साथ बस परिभाषित किया जा सकता है एक Functor
, सब monads अनुप्रयोगी functors हैं, लेकिन हास्केल के typeclass पदानुक्रम दुर्भाग्य से ऐसा नहीं करता historical reasons के लिए इसकी आवश्यकता है)।
एक अतिरिक्त नोट के रूप में, आपको शायद मोनैड पर बहुत अधिक ध्यान केंद्रित नहीं करना चाहिए, इससे कोई फर्क नहीं पड़ता कि वे गुमराह किए गए गैर-हास्केलर्स से किस प्रकार की चर्चा करते हैं। ऐसे कई प्रकार के वर्ग हैं जो सार्थक और शक्तिशाली पैटर्न का प्रतिनिधित्व करते हैं, और सबकुछ एक मोनड के रूप में सबसे अच्छा नहीं है। Applicative, Monoid, Foldable ... जो उपयोग करने के लिए अमूर्तता पूरी तरह से आपकी स्थिति पर निर्भर करता है। और, ज़ाहिर है, सिर्फ इसलिए कि कुछ मोनड का मतलब यह नहीं है कि यह अन्य चीजें भी नहीं हो सकती है; एक मोनड होने के नाते एक प्रकार की एक और संपत्ति है।
तो, आपको "monads की पहचान" के बारे में बहुत कुछ नहीं सोचना चाहिए; प्रश्न इस प्रकार हैं:
- क्या यह कोड एक साधारण monadic रूप में व्यक्त किया जा सकता है? किस मोनड के साथ?
- क्या इस प्रकार मैंने अभी एक मोनड परिभाषित किया है? Monads पर मानक कार्यों द्वारा एन्कोड किए गए जेनेरिक पैटर्न क्या मैं इसका लाभ उठा सकता हूं?
यह कम है "यह समस्या सोमवार को हल की जानी चाहिए", और अधिक "इस समस्या को [कुछ डेटा प्रकार] के साथ हल किया जाना चाहिए, और हे! कितना सुविधाजनक, [वह डेटा प्रकार] मोनाड का एक उदाहरण है, जिससे मुझे बहुत कुछ मिलता है काम करने के लिए composability। " –
@ डैनबर्टन: निश्चित रूप से वही तरीका है कि किसी अन्य प्रकार के डिज़ाइन पैटर्न को भी लागू किया जाता है, भले ही वह किसी ऑब्जेक्ट-उन्मुख, प्रक्रियात्मक, कार्यात्मक, बैकट्रैकिंग तर्क, संगत या किसी अन्य प्रकार की भाषा में हो। –