एक कोमोनड क्या है और वे कैसे उपयोगी हैं?


16

हाल ही में मैं अपने ज्ञान को बंद कर रहा हूं कि मोनाड्स कैसे काम करते हैं। मुझे एक 'कोमोनड' की अवधारणा से भी परिचित कराया गया है , जिसे एक सन्यासी के विलोम दोहरे के रूप में वर्णित किया गया है । हालांकि, मुझे इसके चारों ओर अपना सिर लपेटना असंभव है।

मोनाड्स को समझने के लिए, मैंने खुद के लिए खुद को सादृश्य बनाया:

मोनाड्स को 'अभिव्यक्ति की कन्वेयर बेल्ट बनाने के लिए एक खाका' के रूप में देखा जा सकता है।

एक नए मोनाड (एक नई तरह की कन्वेयर-बेल्ट प्रणाली) को परिभाषित करने के लिए आपको परिभाषित करने की आवश्यकता है:

  1. एक कन्वेयर बेल्ट पर कुछ डालने का एक तरीका, जैसे एक कन्वेयर बेल्ट 'स्टार्ट'। (के रूप में जाना unitया return)
  2. एक मशीन (एक अभिव्यक्ति) को जोड़ने का एक तरीका जो एक कन्वेयर बेल्ट का एक कन्वेयर बेल्ट का हिस्सा होगा। (के रूप में जाना joinया bindया >>=)।

(एक तीसरा ऑपरेशन है जो वर्तमान कन्वेयर बेल्ट लेता है, अपनी सामग्री को दूर फेंकता है और एक नया कन्वेयर बेल्ट के रूप में जाना जाता है >>, लेकिन इसका उपयोग बहुत कम ही किया जाता है।)

मशीनों और कन्वेयर को एक साथ ठीक से काम करने के लिए, आपको यह सुनिश्चित करना होगा कि:

  1. यदि आप एक कन्वेयर बेल्ट पर कुछ डालते हैं और इसे एक मशीन के माध्यम से पारित करते हैं, तो आउटपुट उसी तरह होना चाहिए जब आप इसे मशीन से मैन्युअल रूप से पास करते हैं। (बाएं पहचान)
  2. यदि आप पहले से मौजूद कन्वेयर बेल्ट के बीच एक कन्वेयर-बेल्ट लगाना चाहते हैं, तो आपको एक कन्वेयर बेल्ट के साथ समाप्त नहीं होना चाहिए, जिसमें शीर्ष पर एक कन्वेयर बेल्ट है, बल्कि एक एकल, लंबे समय तक कन्वेयर बेल्ट है। (सही पहचान)
  3. आउटपुट के लिए कोई फर्क नहीं पड़ता अगर आप मैन्युअल रूप से मशीन ए का उपयोग करते हैं, और फिर कन्वेयर से जुड़े बीसी के माध्यम से परिणाम पास करते हैं, या यदि आप कन्वेयर से जुड़े एबी का उपयोग करते हैं और फिर सी के माध्यम से मैन्युअल रूप से परिणाम पास करते हैं: >> = b) >> = c) जैसा होना चाहिए (a >> = (b = = c)) (एसोसिएटिविटी)

सबसे सरल कन्वेयर-बेल्ट वह होगा जो केवल इनपुट लेता है और हमेशा अगली अभिव्यक्ति पर जारी रहता है। यह एक 'पाइपलाइन' है।

एक और संभावना है, यह केवल अगली मशीन के माध्यम से जाने के लिए है अगर कुछ शर्त मूल्य के लिए मिलती है। इसका मतलब यह है कि यदि कुछ भावों के बीच में, मान उस चीज़ में बदल जाता है जिसे अब अनुमति नहीं है, तो बाकी अभिव्यक्तियों को छोड़ दिया जाएगा। हास्केल में 'हो सकता है' मोनाड यही करता है।

आप उन्हें मशीन में पास करने से पहले या बाद में मूल्यों पर अन्य फैंसी सशर्त प्रति / नियम भी बदल सकते हैं। एक उदाहरण: पार्सर्स (यहां, यदि कोई अभिव्यक्ति 'विफलता' परिणाम देता है, तो अभिव्यक्ति से पहले का मूल्य आउटपुट के रूप में उपयोग किया जाता है)।

बेशक सादृश्य सही नहीं है, लेकिन मुझे आशा है कि यह ठीक ढंग से प्रतिनिधित्व करता है कि भिक्षु कैसे काम करते हैं।

हालाँकि, इस समरूपता को कॉमनॉड्स को समझने के लिए मुझे अपने सिर पर हाथ फेरने में बहुत परेशानी हो रही है। मुझे पता है कि इंटरनेट पर मुझे मिली छोटी-छोटी जानकारी से पता चलता है कि कोमोनॉड परिभाषित करता है:

  • extract, जो कि रिवर्स के प्रकार है return, अर्थात, यह एक कोमोनॉड से बाहर मूल्य लेता है ।
  • duplicate, जो कि इसके विपरीत है join, यानी यह एक ही से दो कॉमनॉड्स बनाता है।

लेकिन अगर हम केवल उनसे निकालने या उन्हें डुप्लिकेट करने में सक्षम हैं, तो एक कोमोनॉड को तुरंत कैसे किया जा सकता है? और वास्तव में उनका उपयोग कैसे किया जा सकता है? मैंने इसे बहुत ही अद्भुत परियोजना और इसके बारे में बात (जिसे मैं दुर्भाग्य से बहुत कम समझ पाया था) देखा है, लेकिन मुझे यकीन नहीं है कि कार्यक्षमता का कौन सा हिस्सा बिल्कुल कोमोनॉड द्वारा प्रदान किया गया है।

एक कोमोनॉड क्या है? वे किसके लिए उपयोगी हैं? उनका उपयोग कैसे किया जा सकता है? क्या वे खाद्य हैं?


2
"अगर हम केवल उनसे निकालने या उन्हें डुप्लिकेट करने में सक्षम हैं, तो एक कोमोनॉड को कैसे त्वरित किया जा सकता है?" - मैं आपके प्रश्न का उत्तर एक प्रश्न के साथ दूंगा: यदि आप केवल उन में मूल्यों को उठाने में सक्षम हैं और संगणनाओं का अनुक्रम कर सकते हैं तो मोनाड का सेवन कैसे किया जा सकता है?
बेंजामिन हॉजसन

1
"कन्वेयर बेल्ट के अंत में मशीन" (एक तरफ: मुझे मोनाड के बारे में बात करते समय उन सभी उपमाओं की मदद नहीं मिलती है) IOजो हास्केल रनटाइम सिस्टम है, जो आक्रमण करता है main। वहाँ भी है unsafePerformIO, बिल्कुल। यदि आप Maybeमोनाड को "कन्वेयर बेल्ट के अंत में मशीन" के रूप में सोचना चाहते हैं तो आप उपयोग कर सकते हैं maybe
बेंजामिन हॉजसन

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

2
कोमोनॉड या मोनाड के विशिष्ट उदाहरण में स्पष्ट रूप से टाइपकास्टेस
जेके

2
ऐसा नहीं है कि यह उपयोगी होने जा रहा है यदि आप श्रेणी-सैद्धांतिक / गणितीय पक्ष से इस प्रश्न को नहीं लेते हैं, लेकिन मैं यह बताना चाहता था कि कॉमनोड उलटा नहीं है, बल्कि एक सन्यासी का दोहरा है।
जोर्ज डब्ल्यू मित्तग

जवाबों:


11

एक कोमोनॉड, एक मोनड की तरह, श्रेणी सिद्धांत में एक गणितीय संरचना है। सह-उपसर्ग बहुत आम है "उलटा" को निरूपित करने के लिए जैसा कि आप इसे डालते हैं (हालांकि मुझे नहीं लगता कि शुद्ध गणितज्ञ शब्द की पसंद पर सहमत हैं)।

श्रेणी के सिद्धांत में categories, जो संक्षेप में objects(किसी भी प्रकार या प्रकृति का, आंतरिक संरचना अप्रासंगिक है) और arrowsइन वस्तुओं के बीच कुछ का एक संग्रह रखा जाता है। एक श्रेणी के लिए कुछ के लिए, तीर को कुछ कानूनों (बाएं / दाएं-पहचान और सहकारिता) का पालन करना चाहिए, लेकिन यह वास्तव में यहां महत्वपूर्ण नहीं है।

अब, श्रेणी सिद्धांत दोनों बहुत सार / कठिन और विशाल है। यह सब करने के लिए बहुत समय लगता है (और मैंने इसका औपचारिक रूप से अध्ययन नहीं किया है, मुझे केवल कुछ मूल बातें पता हैं), लेकिन एक धारणा है जिसका उपयोग किया जाता है dual। मूल रूप से, हर श्रेणी के लिए आप एक opposite categoryही काम करके निर्माण कर सकते हैं लेकिन "सभी तीरों को उलट"। यह एक बहुत ही भोली परिभाषा है लेकिन इसे संक्षेप में बताने का प्रयास करना कठिन है। किसी श्रेणी C में किसी चीज़ का दोहरी होना मूल रूप से विपरीत श्रेणी C_op में एक ही बात है (अभी तक सिरदर्द हो रहा है?)

वैसे भी, यदि आपके पास कुछ श्रेणी पर एक मोनाड है (और एक श्रेणी उदाहरण के लिए एक श्रेणी हो सकती है, जहां वस्तुएं कुछ प्रोग्रामिंग भाषा में टाइप होती हैं और तीर प्रकार के बीच फ़ंक्शन होते हैं), तो एक कोमोनड मूल रूप से एक ही बात है, केवल आप 'ने सभी तीरों को उलट दिया (इस मामले में फ़ंक्शन हस्ताक्षरों को उलटने की तरह)।

इस चर्चा में एरिक मीजर और ब्रायन बेकमैन के बीच एक और "हैंड्स-ऑन" विवरण (यद्यपि हैंड्स-ऑन नहीं है) पाया जा सकता है, जहां वे द्वैत की धारणा पर चर्चा कर रहे हैं और एरिक ने IEnumerable<T>सी # के लिए "तीर को उलट" दिया था। प्रतिक्रियाशील ढांचा तैयार करना और IObservable<T>(जहां तक ​​मैं बता सकता हूं, और मुझे सही होने की खुशी है, मूल रूप से एक सूची कोमोनॉड उदाहरण है)।

वीडियो में वर्णित कॉमनॉड्स का एक और व्यावहारिक उदाहरण Task<T>.NET में प्रकार है, जहां ( # C में कहा जाता है) का दोहरीकरण Task<U> ContinueWith<U>(Func<Task<T>, U>)होगा bind(SelectMany


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.