हाल ही में मैं अपने ज्ञान को बंद कर रहा हूं कि मोनाड्स कैसे काम करते हैं। मुझे एक 'कोमोनड' की अवधारणा से भी परिचित कराया गया है , जिसे एक सन्यासी के विलोम दोहरे के रूप में वर्णित किया गया है । हालांकि, मुझे इसके चारों ओर अपना सिर लपेटना असंभव है।
मोनाड्स को समझने के लिए, मैंने खुद के लिए खुद को सादृश्य बनाया:
मोनाड्स को 'अभिव्यक्ति की कन्वेयर बेल्ट बनाने के लिए एक खाका' के रूप में देखा जा सकता है।
एक नए मोनाड (एक नई तरह की कन्वेयर-बेल्ट प्रणाली) को परिभाषित करने के लिए आपको परिभाषित करने की आवश्यकता है:
- एक कन्वेयर बेल्ट पर कुछ डालने का एक तरीका, जैसे एक कन्वेयर बेल्ट 'स्टार्ट'। (के रूप में जाना
unit
याreturn
)- एक मशीन (एक अभिव्यक्ति) को जोड़ने का एक तरीका जो एक कन्वेयर बेल्ट का एक कन्वेयर बेल्ट का हिस्सा होगा। (के रूप में जाना
join
याbind
या>>=
)।(एक तीसरा ऑपरेशन है जो वर्तमान कन्वेयर बेल्ट लेता है, अपनी सामग्री को दूर फेंकता है और एक नया कन्वेयर बेल्ट के रूप में जाना जाता है
>>
, लेकिन इसका उपयोग बहुत कम ही किया जाता है।)मशीनों और कन्वेयर को एक साथ ठीक से काम करने के लिए, आपको यह सुनिश्चित करना होगा कि:
- यदि आप एक कन्वेयर बेल्ट पर कुछ डालते हैं और इसे एक मशीन के माध्यम से पारित करते हैं, तो आउटपुट उसी तरह होना चाहिए जब आप इसे मशीन से मैन्युअल रूप से पास करते हैं। (बाएं पहचान)
- यदि आप पहले से मौजूद कन्वेयर बेल्ट के बीच एक कन्वेयर-बेल्ट लगाना चाहते हैं, तो आपको एक कन्वेयर बेल्ट के साथ समाप्त नहीं होना चाहिए, जिसमें शीर्ष पर एक कन्वेयर बेल्ट है, बल्कि एक एकल, लंबे समय तक कन्वेयर बेल्ट है। (सही पहचान)
- आउटपुट के लिए कोई फर्क नहीं पड़ता अगर आप मैन्युअल रूप से मशीन ए का उपयोग करते हैं, और फिर कन्वेयर से जुड़े बीसी के माध्यम से परिणाम पास करते हैं, या यदि आप कन्वेयर से जुड़े एबी का उपयोग करते हैं और फिर सी के माध्यम से मैन्युअल रूप से परिणाम पास करते हैं: >> = b) >> = c) जैसा होना चाहिए (a >> = (b = = c)) (एसोसिएटिविटी)
सबसे सरल कन्वेयर-बेल्ट वह होगा जो केवल इनपुट लेता है और हमेशा अगली अभिव्यक्ति पर जारी रहता है। यह एक 'पाइपलाइन' है।
एक और संभावना है, यह केवल अगली मशीन के माध्यम से जाने के लिए है अगर कुछ शर्त मूल्य के लिए मिलती है। इसका मतलब यह है कि यदि कुछ भावों के बीच में, मान उस चीज़ में बदल जाता है जिसे अब अनुमति नहीं है, तो बाकी अभिव्यक्तियों को छोड़ दिया जाएगा। हास्केल में 'हो सकता है' मोनाड यही करता है।
आप उन्हें मशीन में पास करने से पहले या बाद में मूल्यों पर अन्य फैंसी सशर्त प्रति / नियम भी बदल सकते हैं। एक उदाहरण: पार्सर्स (यहां, यदि कोई अभिव्यक्ति 'विफलता' परिणाम देता है, तो अभिव्यक्ति से पहले का मूल्य आउटपुट के रूप में उपयोग किया जाता है)।
बेशक सादृश्य सही नहीं है, लेकिन मुझे आशा है कि यह ठीक ढंग से प्रतिनिधित्व करता है कि भिक्षु कैसे काम करते हैं।
हालाँकि, इस समरूपता को कॉमनॉड्स को समझने के लिए मुझे अपने सिर पर हाथ फेरने में बहुत परेशानी हो रही है। मुझे पता है कि इंटरनेट पर मुझे मिली छोटी-छोटी जानकारी से पता चलता है कि कोमोनॉड परिभाषित करता है:
extract
, जो कि रिवर्स के प्रकार हैreturn
, अर्थात, यह एक कोमोनॉड से बाहर मूल्य लेता है ।duplicate
, जो कि इसके विपरीत हैjoin
, यानी यह एक ही से दो कॉमनॉड्स बनाता है।
लेकिन अगर हम केवल उनसे निकालने या उन्हें डुप्लिकेट करने में सक्षम हैं, तो एक कोमोनॉड को तुरंत कैसे किया जा सकता है? और वास्तव में उनका उपयोग कैसे किया जा सकता है? मैंने इसे बहुत ही अद्भुत परियोजना और इसके बारे में बात (जिसे मैं दुर्भाग्य से बहुत कम समझ पाया था) देखा है, लेकिन मुझे यकीन नहीं है कि कार्यक्षमता का कौन सा हिस्सा बिल्कुल कोमोनॉड द्वारा प्रदान किया गया है।
एक कोमोनॉड क्या है? वे किसके लिए उपयोगी हैं? उनका उपयोग कैसे किया जा सकता है? क्या वे खाद्य हैं?
IO
जो हास्केल रनटाइम सिस्टम है, जो आक्रमण करता है main
। वहाँ भी है unsafePerformIO
, बिल्कुल। यदि आप Maybe
मोनाड को "कन्वेयर बेल्ट के अंत में मशीन" के रूप में सोचना चाहते हैं तो आप उपयोग कर सकते हैं maybe
।
cobind
अनुप्रयोगों की एक श्रृंखला की शुरुआत में एक कॉमोनाडिक मूल्य का उत्पादन करना चाहते हैं, तो कुछ फ़ंक्शन होना चाहिए जो आपके कॉमोनाड के आंतरिक प्रतिनिधित्व के साथ कुछ उपयोगी होता है।