मुझे तीरंदाजों के बारे में सोचना पसंद है, जैसे मोनाड्स और फ़ंक्टर, प्रोग्रामर को कार्यों की विदेशी रचनाओं को करने की अनुमति देते हैं।
मोनाड्स या एरो (और फ़ंक्टर) के बिना, एक कार्यात्मक भाषा में कार्यों की संरचना एक फ़ंक्शन को दूसरे फ़ंक्शन के परिणाम में लागू करने तक सीमित है। मोनाड्स और फ़ंक्शनलर्स के साथ, आप दो फ़ंक्शंस को परिभाषित कर सकते हैं, और फिर अलग-अलग पुन: प्रयोज्य कोड लिख सकते हैं जो निर्दिष्ट करते हैं कि कैसे उन फ़ंक्शंस, विशेष रूप से मोनड के संदर्भ में, एक-दूसरे के साथ और उन डेटा के साथ बातचीत करते हैं जो उनमें पारित हो जाते हैं। यह कोड मोनाड के बाइंड कोड के भीतर रखा गया है। तो एक मठ एक दृश्य है, बस पुन: प्रयोज्य बाँध कोड के लिए एक कंटेनर है। एक संन्यासी दूसरे संन्यासी के संदर्भ में अलग-अलग तरीके से रचनाएँ करता है।
एक सरल उदाहरण शायद मोनाड है, जहां बाइंड फ़ंक्शन में कोड होता है जैसे कि यदि कोई फ़ंक्शन ए फ़ंक्शन के साथ बना है तो शायद एक मोनड के भीतर, और बी एक कुछ भी नहीं पैदा करता है, तो बाइंड कोड यह सुनिश्चित करेगा कि रचना दो फ़ंक्शन, बी से बाहर आने वाले मूल्य के ए को लागू करने के लिए परेशान किए बिना, कुछ भी नहीं आउटपुट करते हैं। यदि कोई सनक नहीं था, तो प्रोग्रामर को कुछ भी नहीं इनपुट के लिए परीक्षण करने के लिए ए में कोड लिखना होगा।
मोनाड्स का अर्थ यह भी है कि प्रोग्रामर को स्पष्ट रूप से उन मापदंडों को टाइप करने की आवश्यकता नहीं होती है जो प्रत्येक फ़ंक्शन को स्रोत कोड में आवश्यक होते हैं - बाइंड फ़ंक्शन पैरामीटर पासिंग। इसलिए मोनड्स का उपयोग करते हुए, स्रोत कोड फ़ंक्शन नामों के स्थिर श्रृंखला की तरह अधिक दिखना शुरू कर सकता है, बजाय यह देखने के कि कि फ़ंक्शन A "कॉल" फ़ंक्शन B को पैरामीटर C और D के साथ क्या करता है - कोड एक इलेक्ट्रॉनिक सर्किट की तरह अधिक महसूस करना शुरू कर देता है चलती मशीन - अनिवार्यता से अधिक कार्यात्मक।
एरो भी फ़ंक्शन को एक साथ बाँध फ़ंक्शन के साथ जोड़ता है, पुन: प्रयोज्य कार्यक्षमता प्रदान करता है और मापदंडों को छिपाता है। लेकिन एरो खुद को एक साथ जुड़ा और रचा जा सकता है, और वैकल्पिक रूप से रनटाइम पर अन्य एरो को डेटा रूट कर सकता है। अब आप डेटा को एरो के दो रास्तों पर लागू कर सकते हैं, जो डेटा को "अलग-अलग काम करते हैं" और परिणाम को फिर से इकट्ठा करते हैं। या आप डेटा में कुछ मूल्य के आधार पर डेटा को पास करने के लिए एरो की किस शाखा का चयन कर सकते हैं। परिणामी कोड एक इलेक्ट्रॉनिक सर्किट की तरह और भी अधिक है, जिसमें स्विचेस, देरी, एकीकरण आदि हैं। कार्यक्रम बहुत स्थिर दिखता है, और आपको डेटा के बहुत अधिक हेरफेर को देखने में सक्षम नहीं होना चाहिए। इसके बारे में सोचने के लिए कम और कम पैरामीटर हैं, और यह सोचने की ज़रूरत नहीं है कि पैरामीटर क्या मान सकते हैं या नहीं ले सकते हैं।
एक एरोलाइज्ड प्रोग्राम लिखना ज्यादातर शेल्फ एरो का चयन करना शामिल है जैसे स्प्लिटर, स्विच, देरी और इंटीग्रेटर्स, उन एरो में फ़ंक्शंस उठाना, और एरो को एक साथ जोड़कर बड़ा एरो बनाना। एरोलाइज्ड फंक्शनल रिएक्टिव प्रोग्रामिंग में, एरो एक लूप बनाता है, जिसमें दुनिया के इनपुट को प्रोग्राम के अंतिम पुनरावृत्ति से आउटपुट के साथ जोड़ा जाता है, ताकि आउटपुट वास्तविक वर्ल्ड इनपुट पर प्रतिक्रिया करे।
वास्तविक विश्व मूल्यों में से एक समय है। यम्पा में, सिग्नल फ़ंक्शन एरो कंप्यूटर प्रोग्राम के माध्यम से समय पैरामीटर को अदृश्य रूप से थ्रेड करता है - आप कभी भी समय मान तक नहीं पहुंचते हैं, लेकिन यदि आप प्रोग्राम में एक इंटीग्रेटर एरो कनेक्ट करते हैं, तो यह समय के साथ एकीकृत मूल्यों को आउटपुट करेगा जिसे आप तब पास करने के लिए उपयोग कर सकते हैं। अन्य तीर।