2012-03-28 17 views
24

मोनैड पर वहां बहुत सारे ट्यूटोरियल हैं जो कहते हैं ... "देखो! यहां एक ऐसा मामला है जहां हम एक मोनड का उपयोग कर सकते हैं" या "यह एक मोनैड है"। मैं जो जानना चाहता हूं वह यह है कि लोग इस निष्कर्ष पर आने के लिए कुछ कदम उठाते हैं कि वे खुद से कह सकते हैं - "जी व्हाइज़! ऐसा लगता है कि हम यहां एक मोनड का उपयोग कर सकते हैं!"क्लोजर में, हम मैक्रो और इसके विपरीत के बजाय एक मोनड का उपयोग कब करना चाहिए?

तो जब कोई मुझसे कहता है ... "(blah) एक इकाई के साथ कोई संबंध नहीं है ...", यह वास्तव में मुझे मेरे सवाल है, जो कर रहे हैं का जवाब मदद नहीं करता है:

  • कैसे कर मैं यह निर्धारित करने के बारे में सोचता हूं कि मोनैड का उपयोग करके कार्यक्रमों में किस प्रकार के पैटर्न व्यक्त किए जा सकते हैं?
  • जब मैंने उन्हें उपयोग करने की क्षमता की पहचान की है तो मैं अपना खुद का अनुकूलित मोनैड कैसे लिख सकता हूं?

यदि कोई मदद करने में रूचि रखता है तो मैंने मोनैड के बारे में वास्तव में एक लंबा सवाल शुरू किया - Map and Reduce Monad for Clojure... What about a Juxt Monad?

इस प्रश्न पर वापस

जब हम एक इकाई के बजाय एक मैक्रो के उपाध्यक्ष प्रतिकूल का उपयोग करें और चाहिए?

  • मैंने पढ़ा है कि लेखों देखा Ande प्रस्तुतियों का कहना है कि ... 'monads डीएसएल अमूर्त के लिए उपयोग किया जाता है' .... लेकिन clojure डीएसएल पुस्तकालयों से ज्यादातर (जैसे। हिचकी और कोरमा) defmacro उपयोग कर रहे हैं और यह बहुत अच्छा काम करता है।

और यदि हमारे पास मैक्रोज़ हैं तो हमें क्लोजर में मोनाड्स की आवश्यकता क्यों है?

उत्तर

35

मैं दो साल से क्लोजर का उपयोग कर रहा हूं और केवल एक बार जब मैंने कभी मोनैड का इस्तेमाल किया था, यह दिखाने के लिए एक अभ्यास था कि यह किया जा सकता है। मैंने उन्हें "वास्तविक" कोड के लिए कभी भी आवश्यकता नहीं है।

  • वे स्टेटफुल संगणना से निपटने में मुहावरेदार तरह से कर रहे हैं:

    monads भी बहुत कुछ हास्केल में आम कारण होते हैं। क्लोजर में, आप आम तौर पर managed references के साथ राज्य को संभालते हैं, इसलिए क्लोजर में मोनाडों की आवश्यकता नहीं होती है।

  • इसी प्रकार आईओ के लिए: क्लोजर आपको सीधे अपने प्रकार में घोषित किए बिना आईओ करने की अनुमति देता है, इसलिए आपको आईओ मोनड की आवश्यकता नहीं है।

मेरा सुझाव क्लोजर में मानक कार्यात्मक प्रोग्रामिंग पर ध्यान केंद्रित करना होगा। जब तक आप देखते हैं कि आप वास्तव में monads की आवश्यकता है तो मैं उन्हें लाने की कोशिश में बहुत अधिक समय नहीं निवेश करूंगा।

मैक्रोज़ थोड़ा अलग मुद्दा हैं: वे भाषा के संकलन-समय कोड जनरेशन और एक्सटेंशन के लिए हैं वाक्यविन्यास (जिसमें डीएसएल शामिल हो सकते हैं, हालांकि डीएसएल को मैक्रोज़ की आवश्यकता नहीं है)। मैक्रोज़ का उपयोग करता हूं जब निम्न दोनों सत्य हैं:

  1. मैं भाषा सिंटैक्स को इस तरह से विस्तारित करना चाहता हूं जो किसी विशेष समस्या डोमेन को संबोधित करने की मेरी क्षमता में काफी सुधार करे।
  2. I सामान्य कार्यों/फ़ंक्शन संरचना के साथ समान कार्यक्षमता प्राप्त नहीं कर सकता है।यदि संभव हो तो सामान्य कार्य आपकी पहली पसंद होनी चाहिए: वे आमतौर पर लिखने और बनाए रखने के लिए सरल होते हैं।

पीएस आप सही मायने में Clojure के लिए monads में रुचि रखते हैं, यहाँ दो वीडियो मैं व्यक्तिगत रूप से पाया काफी अच्छा कर रहे हैं:

+1

बस जोड़ने के लिए ... क्लोजर मोनैड में मैक्रोज़ का उपयोग करके लागू किया जाता है। तो क्लोजर में मोनैड सिर्फ एक पुस्तकालय है जहां अन्य भाषाओं में उन्हें भाषा का हिस्सा होना चाहिए – Ankur

+2

हास्केल में, "भाषा का हिस्सा" (मानक पुस्तकालय के विपरीत) के मोनैड का एकमात्र हिस्सा सुविधाजनक है नोटेशन, और I/O के लिए उनका उपयोग। – Sgeo

+1

@ अंकुर, जो कि कोई भी समझ में नहीं आता है। एक मोनैड अमूर्तता दो कार्यों द्वारा पूरी तरह से परिभाषित किया जाता है। यदि आप गतिशील रूप से टाइप की गई भाषा का उपयोग कर रहे हैं, तो इस अमूर्तता का उपयोग करने से आपको रोक नहीं है। यदि आपकी भाषा स्थिर रूप से और नाममात्र टाइप की गई है, तो आपको इस अबास्ट्रक्शन का विश्वसनीय रूप से प्रतिनिधित्व करने के लिए उच्च श्रेणी के प्रथम श्रेणी मॉड्यूल की आवश्यकता होगी। – missingfaktor

16

monads और मैक्रो कुछ भी सामान्य नहीं। वे विभिन्न समस्याओं को हल करने के लिए उपयोग किया जाता है। क्लोजर में, मोनैड लाइब्रेरी मोनैड को वाक्य रचनात्मक "यूजर इंटरफेस" को लागू करने के लिए काफी व्यापक रूप से मैक्रोज का उपयोग करती है। आप कुछ लाइब्रेरी के कार्यात्मक रूप से कार्यान्वित करने और बाहरी इंटरफ़ेस के लिए मैक्रोज़ की एक परत जोड़ने के लिए मोनैड का अच्छी तरह से उपयोग कर सकते हैं।

"जब एक Clojure में monads का प्रयोग करेंगे" का सवाल है, मैं दो उपयोग के मामलों को देखने के: आदेश केवल एक बार काम करने के लिए में

1) सामान है कि एक से अधिक इकाई में समझ में आता है को लागू करने के लिए, और बाद में मोनैड "प्लग इन"। Here इस दृष्टिकोण का एक अच्छा उदाहरण है, हालांकि गैर-मामूली अनुप्रयोग के लिए दुर्भाग्य से (एक शैक्षिक दृष्टिकोण से) दृष्टिकोण: तर्क प्रोग्रामिंग।

2) मौजूदा मोनैड आधारभूत संरचना से लाभ के लिए, एक रचना तकनीक को लागू करने के लिए जिसे एक मोनड के रूप में तैयार किया जा सकता है।

क्लोजर में दो अंतर्निहित मोनैड हैं, "चलो" (पहचान मोनैड) और "फॉर" (अनुक्रम मोनैड)। जब भी आप चाहें तो आप उनमें से किसी एक को बाद में अपने कोड में प्लग कर सकते हैं, आपको इसके बजाय "domonad" का उपयोग करना चाहिए। और जब भी आप चाहें कि आपके पास कुछ समान था लेकिन काफी समान नहीं है, तो आपको अपना खुद का मोन लिखने पर विचार करना चाहिए।

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

+0

मामले के संबंध में 1): यहां एक अच्छा लेख है (http://software-ninja-ninja.blogspot.de/2014/04/5-faces-of- निर्भरता- इंजेक्शन-in.html) कैसे monads प्रदान करते हैं क्लोजर में निर्भरता इंजेक्शन के लिए साधन। – Jens

4

@khinsen और @mikera ने इस सवाल का जवाब दिया कि अभी तक कोई अतिरिक्त टिप्पणी नहीं करना है, मुझे लगता है कि वे एक बिंदु चूक गए हैं (या मुझे उनकी टिप्पणियों में यह नहीं मिला)।

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

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

आपके प्रश्न के अनुसार, मैक्रोज़ कभी भी मठों से पहले काम करते हैं। मैक्रोज़ संकलन चरण में काम करते हैं - वे डेटा संरचनाओं को अन्य डेटा संरचनाओं में बदलते हैं। मोनाड्स कम्प्यूटेशंस लिखने के लिए एक डिजाइन पैटर्न हैं।यह अंतर है। क्लोजर में, मैक्रैड मैक्रोज़ (उनके उपयोग को आसान बनाने के लिए) का उपयोग करके लिखे जाते हैं, और इसलिए लोग यह कहते हैं कि आप मोनैड के साथ क्या कर सकते हैं जो आप आसानी से मैक्रोज़ के साथ प्राप्त कर सकते हैं। यह सच है क्योंकि यह क्लोजर में मोनैड डिज़ाइन से बाहर आता है, लेकिन मैक्रोज़ के बारे में भी यही कहा जा सकता है। आपको अधिकतर समय में नए लिखने की आवश्यकता नहीं है, और the first rule of the macro club is to not write them बिल्कुल भी, लेकिन फिर भी वे भाषा का हिस्सा हैं और आपको उनके अनुप्रयोगों के बारे में बहुत अच्छी तरह से अवगत होना चाहिए।

मैक्रोज़ के बारे में अधिक चर्चा के लिए How do Clojure programmers use Macros? देखें।

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

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