2012-01-08 14 views
40

मैं हास्केल सीखने का अपना तरीका हूं, मैं मोनड अवधारणा को समझना शुरू कर रहा हूं और अपने कोड में ज्ञात मोनैड का उपयोग शुरू कर रहा हूं लेकिन मुझे अभी भी एक डिजाइनर दृष्टिकोण से मोनैड के पास आने वाली कठिनाइयों का सामना करना पड़ रहा है। ओओ में ऑब्जेक्ट्स के लिए "संज्ञाएं पहचानें" जैसे कई नियम हैं, किसी प्रकार के राज्य और इंटरफ़ेस के लिए देखें ... लेकिन मैं monads के लिए समकक्ष संसाधन नहीं ढूंढ पा रहा हूं।आप मोनैडिक डिज़ाइन पैटर्न की पहचान कैसे करते हैं?

तो आप प्रकृति में मोनैडिक के रूप में किसी समस्या की पहचान कैसे करते हैं? Monadic डिजाइन के लिए अच्छे डिजाइन पैटर्न क्या हैं? आपका दृष्टिकोण क्या है जब आपको एहसास हो कि कुछ कोड एक मोनैड में बेहतर तरीके से दोबारा सुधार किए जाएंगे?

+8

यह कम है "यह समस्या सोमवार को हल की जानी चाहिए", और अधिक "इस समस्या को [कुछ डेटा प्रकार] के साथ हल किया जाना चाहिए, और हे! कितना सुविधाजनक, [वह डेटा प्रकार] मोनाड का एक उदाहरण है, जिससे मुझे बहुत कुछ मिलता है काम करने के लिए composability। " –

+0

@ डैनबर्टन: निश्चित रूप से वही तरीका है कि किसी अन्य प्रकार के डिज़ाइन पैटर्न को भी लागू किया जाता है, भले ही वह किसी ऑब्जेक्ट-उन्मुख, प्रक्रियात्मक, कार्यात्मक, बैकट्रैकिंग तर्क, संगत या किसी अन्य प्रकार की भाषा में हो। –

उत्तर

57

अंगूठे का एक सहायक नियम है जब आप संदर्भ संदर्भ में देखते हैं;

  • हो सकता है कि: monads पर "प्रभाव" लेयरिंग के रूप में देखा जा सकता है पक्षपात (उपयोग करता है: संगणना कि असफल हो सकता है)
  • कोई एक: कम सर्किटिंग त्रुटियों (उपयोग करता है: त्रुटि/अपवाद हैंडलिंग)
  • [] (सूची इकाई): nondeterminism (उपयोग करता है: सूची पीढ़ी, छानने, ...)
  • राज्य: एक भी परिवर्तनशील संदर्भ (का उपयोग करता है: राज्य)
  • 012,351,
  • रीडर: एक साझा पर्यावरण (उपयोग करता है: चर बाइंडिंग, समान जानकारी, ...)
  • लेखक: एक "पक्ष-चैनल" उत्पादन या संचय (उपयोग करता है: प्रवेश, काउंटर एक-केवल लिखने को बनाए रखने, ...)
  • शेष भाग: गैर स्थानीय नियंत्रण प्रवाह (का उपयोग करता है: भी कई सूची)

आमतौर पर, आप आम तौर पर अपनी इकाई मानक Monad Transformer Library से इकाई ट्रांसफार्मर पर लेयरिंग द्वारा डिजाइन चाहिए, जो आपको उपर्युक्त प्रभाव को एक मो में जोड़ देता है नाद। साथ में, ये उन अधिकांश मोनैड को संभालते हैं जिन्हें आप उपयोग करना चाहते हैं। एमटीएल में शामिल कुछ अतिरिक्त मोनैड शामिल नहीं हैं, जैसे probability और supply मोनैड।

जहाँ तक कि क्या एक नव परिभाषित प्रकार एक इकाई है, और यह कैसे एक के रूप में व्यवहार करती है, आप से FunctorMonad अप करने के लिए जा रहा द्वारा इसके बारे में सोच सकते हैं के लिए एक अंतर्ज्ञान के विकास के रूप में:

  • 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 पर मानक कार्यों द्वारा एन्कोड किए गए जेनेरिक पैटर्न क्या मैं इसका लाभ उठा सकता हूं?
+3

ओह, बहुत अच्छा। अगर मैं सो नहीं रहा तो बहुत ज्यादा जवाब मैंने लिखा होगा, हाहा। मैन, मैं मुश्किल से आप लोगों के साथ रह सकता हूं ... –

+3

@ सीए.एमसीकैन: जब प्रतिनिधि प्राप्त किया जा सकता है तो आप कैसे सो सकते हैं ?! :) – ehird

+0

@ehird +1 आप हाल ही में बहुत से महान उत्तरों को क्रैंकिंग कर रहे हैं। –

15

प्रकारों का पालन करें।

यदि आप पाते हैं आप इन प्रकार

  • (a -> b) -> YourType a -> YourType b
  • a -> YourType a
  • YourType (YourType a) -> YourType a

या इन प्रकार के सभी के सभी के साथ काम करता है लिखा है

  • a -> YourType a
  • YourType a -> (a -> YourType b) -> YourType b

तो YourType एक इकाई हो सकता है। (मैं कहता हूँ "हो सकता है" क्योंकि कार्यों इकाई कानूनों के रूप में अच्छी तरह से पालन करना चाहिए।)

(याद रखें कि आप तर्क क्रम बदल सकते हैं, तो जैसे YourType a -> (a -> b) -> YourType b सिर्फ भेष में (a -> b) -> YourType a -> YourType b है।)

केवल के लिए बाहर न देखें monads! आप इन प्रकार के सभी

  • YourType
  • YourType -> YourType -> YourType

के कार्यों है और वे monoid कानूनों का पालन करना है, तो आप एक monoid है! यह भी मूल्यवान हो सकता है। इसी प्रकार अन्य टाइपक्लास के लिए, सबसे महत्वपूर्ण रूप से फंक्टर।

6

monads के प्रभाव को देखने नहीं है: - पक्षपात/विफलता शॉर्ट-सर्किट

  • या तो - त्रुटि रिपोर्टिंग/शॉर्ट सर्किट (और जानकारी के साथ की तरह हो सकता है)
  • लेखक -

    • हो सकता है कि केवल लिखने "राज्य", आमतौर पर
    • रीडर प्रवेश करने - केवल पढ़ने के लिए राज्य, आमतौर पर पर्यावरण गुजर
    • राज्य - पढ़ने/लिखने राज्य
    • बहाली - pausable गणना
    • सूची - कई सफलताओं

    एक बार जब आप इन प्रभावों को अपने उन इकाई ट्रांसफार्मर के साथ संयोजन monads निर्माण करने के लिए आसान से परिचित हैं। ध्यान दें कि कुछ monads संयोजन विशेष देखभाल की जरूरत है (विशेष रूप से Cont और बैकट्रैकिंग के साथ किसी भी monads)।

    ध्यान देने योग्य एक बात यह है कि कई मोनैड नहीं हैं। ऐसे कुछ विदेशी लोग हैं जो मानक पुस्तकालयों में नहीं हैं जैसे संभाव्यता मोनैड और कॉन्टैसिटी जैसे कॉन्ट मोनैड की विविधताएं। लेकिन जब तक कि आप कुछ गणितीय नहीं कर रहे हैं, तो आप एक नए मोनैड का आविष्कार (या खोज) करेंगे, हालांकि यदि आप लंबे समय तक हास्केल का उपयोग करते हैं तो आप कई मोनैड बनाएंगे जो मानक वाले विभिन्न संयोजन हैं।

    संपादित करें - यह भी ध्यान रखें कि आपको अलग monads में इकाई ट्रांसफार्मर परिणाम ढेर:

    आप एक लेखक इकाई को ErrorT (ट्रांसफार्मर) जोड़ने, तो आप इस इकाई Either err (log,a) मिल - आप केवल लॉग यदि आप उपयोग कर सकते हैं कोई त्रुटि नहीं है

    यदि आप एक त्रुटि monad में WriterT (ट्रांसफ़ोमर) जोड़ते हैं, तो आपको यह monad (log, Either err a) मिलता है जो हमेशा लॉग तक पहुंच प्रदान करता है।

  • 4

    यह एक गैर-उत्तर है, लेकिन मुझे लगता है कि वैसे भी कहना महत्वपूर्ण है। बस पूछो! स्टैक ओवरव्लो,/आर/हैकसेल, और # हास्केल आईआरसी चैनल स्मार्ट लोगों से त्वरित प्रतिक्रिया प्राप्त करने के लिए सभी बेहतरीन जगह हैं। यदि आप किसी समस्या पर काम कर रहे हैं, और आपको संदेह है कि कुछ मोनैडिक जादू है जो इसे आसान बना सकता है, बस पूछो! हास्केल समुदाय समस्याओं को हल करने के लिए प्यार करता है, और हास्यास्पद रूप से दोस्ताना है।

    गलत मत समझो, मैं आपको अपने लिए कभी नहीं सीखने के लिए प्रोत्साहित नहीं कर रहा हूं। इसके विपरीत, हास्केल समुदाय के साथ बातचीत करना सर्वोत्तम सीखने के तरीकों में से एक है। LYAH और RWH, 2 हास्केल किताबें जो मुफ्त में ऑनलाइन उपलब्ध हैं, अत्यधिक अनुशंसा भी की जाती है।

    ओह, और खेलना, खेलना, खेलना न भूलें! जैसे ही आप मोनैडिक कोड के साथ खेलते हैं, आप "आकार" monads के बारे में महसूस करना शुरू कर देंगे, और जब monadic combinators उपयोगी हो सकता है। यदि आप अपना खुद का मोनड रोल कर रहे हैं, तो आमतौर पर टाइप सिस्टम आपको एक स्पष्ट, सरल समाधान के लिए मार्गदर्शन करेगा। लेकिन ईमानदार होने के लिए, आपको शायद ही कभी मोनाड के अपने उदाहरण को रोल करने की आवश्यकता होनी चाहिए, क्योंकि हास्केल पुस्तकालय अन्य उत्तरदाताओं द्वारा उल्लिखित उपयोगी चीजें प्रदान करते हैं।

    संबंधित मुद्दे