मोनाड्स क्या प्रोग्रामिंग समस्याओं को हल करते हैं? [बन्द है]


14

मैंने बहुत सारी पोस्ट पढ़ी हैं जो बताती हैं कि भिक्षु क्या, कैसे unitऔर bindकाम करते हैं, उनमें से कुछ सीधे श्रेणी के सिद्धांत में डूब जाते हैं इसलिए सार (मेरे लिए कम से कम) जो आंखों से खून बहता है, कुछ को पूरी तरह से अनदेखा करना और किसी के अजीब उपमाओं को छूना burritos, बक्से और क्या नहीं।

कुछ हफ्तों के अध्ययन और बहुत सारे तले हुए न्यूरॉन्स के बाद, (मुझे लगता है) मैं समझता हूं कि मोनाड्स कैसे काम करते हैं। लेकिन अभी भी एक चीज है जो मेरी समझ से बच जाती है, कुछ ऐसा जो वास्तव में कुछ पदों को छूता है (आईओ और राज्य को छोड़कर):

क्यों?

मोनाड्स क्यों मायने रखते हैं? वे इतने महत्वपूर्ण क्यों हैं? वे क्या समस्याएं हल कर रहे हैं? क्या उन समस्याओं को केवल मोनाड्स के साथ हल किया जा सकता है या कुछ अन्य तरीके हैं?


3
कार्यक्रम बड़े और जटिल हैं। हमें उन्हें ढाँपने के तरीके चाहिए। बहुत तरीके हैं। मोनाड एक हैं। तीर एक हैं। फ़नकार एक हैं। ऑब्जेक्ट्स, क्लासेस, फ़ंक्शंस, मेथड्स, मॉड्यूल्स, ट्रेल्स, मिक्सिंस, पैकेज, कुछ अन्य हैं, यह वास्तव में स्पष्ट नहीं है कि आपका विशिष्ट प्रश्न क्या है। क्या आप पूछ रहे हैं कि हमें कार्यक्रमों की संरचना करने की आवश्यकता क्यों है?
जॉर्ज डब्ल्यू मित्तग

1
@ JörgWMittag: मैं यह नहीं पूछ रहा हूं कि हमें कार्यक्रमों की संरचना करने की आवश्यकता क्यों है। स्पष्ट रूप से एक बड़ी समस्या छोटे लोगों में विभाजित है जिसे आप हल कर सकते हैं और फिर बड़े के लिए समाधान प्राप्त करने के लिए गठबंधन कर सकते हैं। मैं पूछ रहा हूं कि मोनाड्स किन समस्याओं का समाधान करते हैं। क्या यही है? संरचना कोड? क्या यह सब उपद्रव है? उदाहरण के लिए, हास्केल में यह है कि आप I / O कैसे करते हैं। वास्तव में, मोनाड एक नाटक है, जो वास्तव में शुद्ध नहीं होने जैसा कुछ है। मेरा सवाल शीर्षक में है, मुझे नहीं पता कि इसे कैसे स्पष्ट तरीके से कहा जाए।
डमी मी



1
@RobertHarvey: मुझे आपके द्वारा जोड़े गए पहले दो लिंक भी मिले, लेकिन उन और अन्य पोस्टों के जवाबों की तरह, प्रतिक्रियाएं शायद हो सकती हैं, स्टेट, और IO मोनैड्स, जल्दी से उदाहरण या कोड के लिए कूदते हुए, और "बहुत कुछ है" उन समस्याओं का हल जो मोनाड्स के उपयोग से हल की जा सकती हैं ”। अन्य प्रकार की समस्याएं कौन सी हैं? मैं एक उच्च स्तर के उत्तर की तलाश कर रहा हूं जो समान उदाहरणों को दोहराने के बजाय वास्तव में समस्याओं की जड़ में जाता है (जो भी हैं) और समझाते हैं कि मोनाड्स उन्हें कैसे हल करते हैं और यह सबसे अच्छा विकल्प क्यों है, जैसा कि किसी और चीज का उपयोग करने के विपरीत है। हालांकि प्रतिक्रिया के लिए बहुत बहुत धन्यवाद।
डमी मी

जवाबों:


10

आपको कुछ भी हल करने के लिए मठों की आवश्यकता नहीं है । वे बस कुछ चीजों को सरल बनाते हैं। बहुत सारे लोग भिक्षुओं को समझाते समय बहुत सार और सैद्धांतिक हो जाते हैं। अधिकतर, मोनड एक पैटर्न है जो प्रोग्रामिंग में बार-बार आता है। उस पैटर्न को पहचानकर, हम अपने कोड को सरल बना सकते हैं और कुछ कार्यों को कार्यान्वित करने से बच सकते हैं।

हास्केल के लिए, एक ठोस दृष्टिकोण से, सबसे अधिक दिखाई देने वाली चीज मोनाड्स सक्षम नहीं है । हास्केल और अन्य भाषाओं में सूची की समझ भी भिक्षुओं का भारी लाभ उठाती है। आप Control.Monad जैसी लाइब्रेरी भी बना सकते हैं ।

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


2
मैं वास्तव में कहना चाहूंगा कि सबसे अधिक दिखाई देने वाली चीज़ हैसेल मोनैड्स IO इफेक्ट्स का एक आसान तरीका है जो वास्तव में आपकी अपेक्षा के अनुरूप काम करता है। मुझे लगता है कि कोई भी सोचता है कि भिक्षु हमें मिरांडा को क्या देना चाहिए । मिरांडा वह भाषा है जिसे हास्केल ने प्रतिस्थापित करने के लिए डिज़ाइन किया था, और हास्केल अनुभव वाले किसी के लिए सीखना बहुत आसान होना चाहिए। मुख्य अंतर यह है कि इसमें मोनोडिक IO नहीं है, जो किसी भी गैर-तुच्छ परियोजना के लिए हास्केल की तुलना में भाषा को अधिक कठिन बनाता है।
जूल्स २

हां, IOहास्केल का सबसे प्रमुख मठ है , लेकिन मैं व्यक्तिगत साधुओं के उदाहरणों को सूचीबद्ध नहीं कर रहा था। मैं उनके द्वारा सक्षम किए जा रहे अतिवृद्धि के उदाहरणों को सूचीबद्ध कर रहा था। मैं कोशिश कर रहा था कि क्यों, उदाहरण के लिए, IO के लिए एक सनक का उपयोग करने के बारे में सोचने वाला पहला लड़का यह सामान्य रूप से एक अच्छा विचार होगा।
कार्ल बेवेलफेल्ट

1
@ जूल्स: या हास्केल के इतिहास को देखें। मोनाड्स से पहले, हास्केल डिजाइनरों ने आई / ओ के लिए आधार के रूप में आलसी धाराओं और निरंतरताओं के साथ प्रयोग किया, और दोनों का उपयोग करना मुश्किल था।
जोर्ग डब्ल्यू मित्तग

5

यह समझना आसान है कि क्या आप विशेष साधुओं को देखते हैं और देखते हैं कि वे क्या समस्याएं हल करते हैं। उदाहरण के लिए, हास्केल में:

  • IO: IO को प्रकार प्रणाली में प्रतिनिधित्व करने की अनुमति देता है, इसलिए आप IO प्रदर्शन करने वाले कार्यों से शुद्ध कार्यों को अलग कर सकते हैं।

  • सूची: आपको सूची बोध और नोडेटेरिमिनिस्टिक संगणना करने की अनुमति देता है।

  • हो सकता है: nulls के लिए एक बेहतर विकल्प है, और C # के null-coalescing ऑपरेटर की तुलना में कुछ का समर्थन करता है।

  • पारसेक: पार्सर्स लिखने के लिए एक सुविधाजनक डीएसएल।

इसलिए यह आसान है (मुझे उम्मीद है) व्यक्तिगत साधुओं के लिए तर्क देखना होगा, क्योंकि वे सभी बहुत उपयोगी हैं। लेकिन वे जो समस्याएँ हल करते हैं वे भी काफी भिन्न होती हैं और उनके चेहरे पर वे आम तौर पर बहुत अधिक नहीं लगती हैं, सिवाय इसके कि वे सभी परिचालन के लिए कुछ तर्क से संबंधित हैं। मोनाड्स उपयोगी होते हैं क्योंकि वे आपको इस तरह के कई उपकरण बनाने की अनुमति देते हैं।

क्या बिना साधुओं के उपरोक्त उदाहरणों को लागू किया जा सकता है? निश्चित रूप से उन्हें एक तदर्थ तरीके से लागू किया जा सकता है, लेकिन भाषा में निर्मित doभिक्षुओं को सीधे- लंगोटे की तरह सीधे लैंगगेट समर्थन की अनुमति देता है जो सभी मठों के साथ काम करता है।


2

एक चीज जो इसे भ्रमित करती है वह है "लोकप्रिय" कार्य जैसे bindऔर <*>प्रैक्सिस ओरिएंटेड। लेकिन अवधारणाओं को समझने के लिए पहले अन्य कार्यों को देखना आसान है। यह भी ध्यान देने योग्य है कि मोनाड बाहर खड़े होते हैं क्योंकि वे अन्य जुड़े हुए अवधारणाओं की तुलना में थोड़ा ओवरहीड होते हैं। इसलिए मैं इसके बजाय फंक्शनलर्स के साथ शुरू करूंगा।

फ़ंक्टर्स एक फ़ंक्शन (हास्केल संकेतन में) प्रदान करते हैं fmap :: (Functor f) => (a -> b) -> f a -> f b। दूसरे शब्दों में, आपके पास एक संदर्भ है fजिसे आप किसी फ़ंक्शन को उठा सकते हैं। जैसा कि आप कल्पना कर सकते हैं कि लगभग कुछ भी एक फ़नकार है। सूचियाँ, हो सकता है, या तो, फ़ंक्शंस, I / O, टुपल्स, पार्सर ... प्रत्येक एक संदर्भ का प्रतिनिधित्व करता है जिसमें एक मान प्रकट हो सकता है। तो आप बेहद बहुमुखी कार्य लिख सकते हैं जो लगभग किसी भी संदर्भ में काम करते हैं fmapया इसके इनलाइन संस्करण का उपयोग करते हैं <$>

आप संदर्भों के साथ क्या अन्य सामान करना चाहते हैं? आप दो संदर्भों को संयोजित करना चाह सकते हैं। तो आप zip :: [a] -> [b] -> [(a,b)]इस तरह के उदाहरण के लिए एक सामान्यीकरण प्राप्त करना चाहते हो सकता है pair :: (Monoidal f) => f a -> f b -> f (a,b):।

लेकिन यह और भी अधिक उपयोगी व्यवहार में है, क्योंकि, हास्केल बजाय की पेशकश पुस्तकालयों Applicative, जिनमें से एक संयोजन है Functorऔर Monoidal, और यह भी की Unitजो सिर्फ कहते हैं कि आप वास्तव में डाल सकते हैं मूल्यों "अंदर" के साथ अपने संदर्भ, unit

आप जिस संदर्भ में काम कर रहे हैं, उसके बारे में इन तीन बातों को बताते हुए आप बेहद सामान्य कार्य लिख सकते हैं।

Monadबस एक और चीज है जो आप उसके ऊपर बता सकते हैं। मैंने पहले जो उल्लेख नहीं किया है वह यह है कि आपके पास दो संदर्भों को संयोजित करने के लिए पहले से ही दो तरीके हैं: आप न केवल pairउन्हें, बल्कि आप उन्हें स्टैक भी कर सकते हैं, जैसे कि आपके पास सूचियों की एक सूची हो सकती है। I / O संदर्भ में, एक उदाहरण I / O क्रिया होगी जो किसी फ़ाइल से अन्य I / O क्रियाओं को पढ़ सकती है, इसलिए आपके पास एक प्रकार होगा FilePath -> IO (IO a)। एक निष्पादन योग्य फ़ंक्शन प्राप्त करने के लिए हम उस स्टैकिंग से कैसे छुटकारा पा सकते हैं IO a? यही कारण है कि जहां है Monadरों joinमें आता है यह हमें ही प्रकार के दो खड़ी संदर्भों गठबंधन करने के लिए अनुमति देता है। एक ही पर्स के लिए जाता है, हो सकता है आदि और bindउपयोग करने के लिए सिर्फ एक और अधिक व्यावहारिक तरीका हैjoin

तो एक विवादास्पद संदर्भ में केवल चार चीजों की पेशकश की जाती है और इसका उपयोग I / O के लिए विकसित लगभग सभी मशीनरी के साथ किया जा सकता है, पार्सर के लिए, विफलताओं के लिए आदि।


1

मोनाड्स आपको विभिन्न गैर-शुद्ध संगणनाओं के साथ-साथ सरलीकृत कोड भी व्यक्त करने देता है

  • स्टेटफुल कम्प्यूटेशन (प्राप्त करें / सेट करें राज्य को मोनड के माध्यम से)
  • I / O (लॉगिंग, UI, फ़ाइल या एक्स की एक सूची का उत्पादन / उपभोग)
  • इसके अलावा, "नॉन-लीनियर" कंट्रोल-फ्लो (यानी अपवाद, हो सकता है, आदि)

और, महत्वपूर्ण बात यह है कि शुद्ध भाषा के साथ समझौता किए बिना और इससे एक स्वच्छ भाषा प्राप्त की जा सकती है


2
यह सच है - लेकिन यह केवल एक हिस्सा है कि साधुओं के लिए क्या उपयोग किया जाता है। सूची की समझ या Maybeकिसी बाहरी चीज़ से संबंधित नहीं हैं।
जैक्सबी

यह उपयोगी होगा यदि डाउनवोटर्स समझाएं कि उन्होंने ऐसा क्यों किया है। मुझे इस जवाब में कुछ भी गलत नहीं दिख रहा है।
जूल्स

@JacquesB, वे, हालांकि, स्टेटफुल हैं।
जूल्स

1
विश्व प्रकार, विशिष्टता प्रकार, रैखिक प्रकार आपको ऐसा करते हैं, हालांकि।
जोर्ग डब्ल्यू मित्तग

@ जूल्स सूची में एक नंदवादवाद के रूप में मोनाड राज्य है? क्या आप स्पष्ट कर सकते हैं कि "स्टेटफुल" की आपकी परिभाषा क्या है?
जैक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.