तेजी से पाठकों का सम्मान करने के लिए, मैं पहले सटीक परिभाषा के साथ शुरू करता हूं, त्वरित "सादे अंग्रेजी" स्पष्टीकरण के साथ जारी रखता हूं, और फिर उदाहरणों पर जाता हूं।
यहाँ थोड़ा संक्षिप्त रूप में संक्षिप्त और सटीक परिभाषा है:
एक मोनड (कंप्यूटर विज्ञान में) औपचारिक रूप से एक मानचित्र है जो:
हर प्रकार Xकी कुछ प्रोग्रामिंग लैंग्वेज को एक नए T(X)प्रकार में Tभेज देता है (जिसे " मानों के साथ -प्रकार के प्रकार" कहा जाता है X);
प्रपत्र के दो कार्यों f:X->T(Y)और g:Y->T(Z)एक फ़ंक्शन के लिए एक नियम से लैस
g∘f:X->T(Z);
एक तरह से जो स्पष्ट अर्थों में साहचर्य है और किसी दिए गए यूनिट फ़ंक्शन के संबंध में एकात्मक है pure_X:X->T(X), जिसे शुद्ध गणना के लिए एक मान लेने के रूप में सोचा जाता है जो बस उस मूल्य को वापस करता है।
तो सरल शब्दों में, एक इकाई एक है किसी भी प्रकार से पारित करने के लिए नियम Xकिसी दूसरे प्रकार मेंT(X) , और एक नियम दो कार्यों से पारित करने के लिए f:X->T(Y)और g:Y->T(Z)एक नया कार्य करने के लिए (है कि आप रचना चाहते हैं लेकिन नहीं कर सकते हैं)h:X->T(Z) । हालांकि, यह सख्त गणितीय अर्थों में रचना नहीं है। हम मूल रूप से "झुका" फ़ंक्शन की रचना या फिर से परिभाषित करते हैं कि फ़ंक्शन कैसे बनाये जाते हैं।
इसके अलावा, हमें "स्पष्ट" गणितीय स्वयंसिद्धों को संतुष्ट करने के लिए मोनाड के नियम की आवश्यकता है:
- संबद्धता : लिखना
fसाथ gऔर फिर साथ h(बाहर से) रचना के रूप में ही किया जाना चाहिए gके साथ hऔर फिर साथ f(अंदर से)।
- वैवाहिक संपत्ति : दोनों तरफ पहचान समारोह के
fसाथ रचना करना चाहिए ।f
फिर, सरल शब्दों में, हम अपनी रचना को फिर से परिभाषित नहीं कर सकते, जैसा कि हम चाहते हैं:
- हमें सबसे पहले समरूपता की आवश्यकता होती है
f(g(h(k(x))), जैसे कि एक पंक्ति में कई कार्यों की रचना करने में सक्षम होना चाहिए , और फ़ंक्शन जोड़े को क्रमबद्ध करने के लिए निर्दिष्ट करने के बारे में चिंता न करें। जैसा कि मोनाद नियम केवल यह बताता है कि एक जोड़ी कार्यों की रचना कैसे की जाती है , उस स्वयंसिद्ध के बिना, हमें यह जानना होगा कि कौन सी जोड़ी पहले और इसी तरह से बनी है। (ध्यान दें कि commutativity संपत्ति से अलग है fके साथ बना gएक ही रूप में थे gके साथ बना fहै, जो आवश्यक नहीं है)।
- और दूसरा, हमें वैवाहिक संपत्ति की आवश्यकता है, जो केवल यह कहने के लिए है कि पहचान तुच्छ तरीके से रचना करते हैं जिस तरह से हम उनसे उम्मीद करते हैं। इसलिए जब भी उन पहचानों को निकाला जा सकता है, हम सुरक्षित रूप से कार्य कर सकते हैं।
तो फिर से संक्षेप में: एक सनक दो स्वयंसिद्ध - संघात्मकता और वैवाहिक संपत्ति को संतुष्ट करने वाले प्रकार के विस्तार और रचना के कार्यों का नियम है।
व्यावहारिक रूप से, आप चाहते हैं कि भाषा, संकलक या रूपरेखा द्वारा आपके लिए मोनाड लागू किया जाए जो आपके लिए रचनाओं का ध्यान रखे। इसलिए आप अपने कार्य के तर्क को लिखने के बजाय इस बात पर ध्यान केंद्रित कर सकते हैं कि उनका निष्पादन कैसे लागू किया जाता है।
यह अनिवार्य रूप से यह है, संक्षेप में।
पेशेवर गणितज्ञ होने के नाते, मैं h"रचना" fऔर से कॉल करने से बचना पसंद करता हूँ g। क्योंकि गणितीय रूप से, यह नहीं है। इसे "रचना" कहना गलत तरीके hसे सही गणितीय रचना है, जो यह नहीं है। यह विशिष्ट रूप से भी निर्धारित नहीं है fऔर g। इसके बजाय, यह हमारे संन्यासी के नए "कार्यों की रचना करने के नियम" का परिणाम है। जो कि वास्तविक गणितीय संरचना से बिलकुल अलग हो सकता है, भले ही उत्तरार्द्ध मौजूद हो!
इसे कम सूखा बनाने के लिए, मैं इसे उदाहरण के द्वारा समझाने की कोशिश करता हूं कि मैं छोटे वर्गों के साथ एनोटेट कर रहा हूं, इसलिए आप बिंदु पर सही छोड़ सकते हैं।
मोनाद उदाहरण के रूप में फेंकने वाला अपवाद
मान लें कि हम दो कार्य करना चाहते हैं:
f: x -> 1 / x
g: y -> 2 * y
लेकिन f(0)परिभाषित नहीं है, इसलिए एक अपवाद eफेंक दिया गया है। फिर आप संरचनागत मूल्य को कैसे परिभाषित कर सकते हैं g(f(0))? एक अपवाद फिर से फेंको, बिल्कुल! शायद वही e। शायद एक नया अद्यतन अपवाद e1।
यहाँ ठीक क्या होता है? सबसे पहले, हमें नए अपवाद मूल्य (अलग-अलग या समान) चाहिए। आप उन्हें nothingया nullजो भी कह सकते हैं, लेकिन सार एक ही रहता है - वे नए मूल्य होने चाहिए, जैसे कि यह numberहमारे उदाहरण में नहीं होना चाहिए । मैं उन्हें किसी विशेष भाषा में nullकैसे nullलागू किया जा सकता है, इस भ्रम से बचने के लिए नहीं बुलाना पसंद करता हूं । समान रूप से मैं इससे बचना पसंद करता हूं nothingक्योंकि यह अक्सर साथ जुड़ा होता है null, जो, सिद्धांत रूप में, क्या nullकरना चाहिए, हालांकि, उस सिद्धांत को अक्सर जो भी व्यावहारिक कारणों के लिए झुकना पड़ता है।
क्या वास्तव में अपवाद है?
किसी भी अनुभवी प्रोग्रामर के लिए यह एक तुच्छ मामला है, लेकिन मैं किसी भी शब्द को भ्रम की स्थिति से बाहर निकालने के लिए कुछ शब्द छोड़ना चाहता हूं:
अपवाद एक ऐसी वस्तु है जो जानकारी के बारे में जानकारी देती है कि निष्पादन का अमान्य परिणाम कैसे हुआ।
यह किसी भी विवरण को फेंकने और एक वैश्विक मूल्य (जैसे NaNया null) को वापस करने या लंबी लॉग सूची बनाने या वास्तव में क्या हुआ, से लेकर डेटाबेस तक भेजने और वितरित डेटा भंडारण परत पर सभी की नकल करने तक हो सकता है;)
अपवाद के इन दो चरम उदाहरणों के बीच महत्वपूर्ण अंतर यह है कि पहले मामले में कोई दुष्प्रभाव नहीं हैं । दूसरे में हैं। जो हमें (हजार-डॉलर) प्रश्न पर लाता है:
क्या शुद्ध कार्यों में अपवादों की अनुमति है?
कम जवाब : हाँ, लेकिन केवल जब वे साइड-इफेक्ट के लिए नेतृत्व नहीं करते।
लंबा जवाब। शुद्ध होने के लिए, आपके फ़ंक्शन के आउटपुट को विशिष्ट रूप से इसके इनपुट द्वारा निर्धारित किया जाना चाहिए। इसलिए हम अपने कार्य को नए अमूर्त मूल्य पर fभेजकर संशोधन करते हैं जिसे हम अपवाद कहते हैं। हम यह सुनिश्चित करते हैं कि मूल्य में कोई बाहरी जानकारी नहीं है जो हमारे इनपुट द्वारा विशिष्ट रूप से निर्धारित नहीं है, जो है । तो यहाँ साइड इफेक्ट के बिना अपवाद का एक उदाहरण है:0eex
e = {
type: error,
message: 'I got error trying to divide 1 by 0'
}
और यहाँ एक पक्ष प्रभाव के साथ है:
e = {
type: error,
message: 'Our committee to decide what is 1/0 is currently away'
}
वास्तव में, इसका केवल साइड-इफ़ेक्ट है अगर वह संदेश भविष्य में संभवतः बदल सकता है। लेकिन अगर इसे कभी नहीं बदलने की गारंटी दी जाती है, तो यह मूल्य विशिष्ट रूप से अनुमानित हो जाता है, और इसलिए इसका कोई दुष्प्रभाव नहीं है।
इसे भी सिलियर बनाने के लिए। 42कभी लौट रहा एक समारोह स्पष्ट रूप से शुद्ध है। लेकिन अगर कोई पागल 42ऐसा वैरिएबल बनाने का फैसला करता है जो मूल्य बदल सकता है, तो बहुत ही फ़ंक्शन नई शर्तों के तहत शुद्ध होना बंद कर देता है।
ध्यान दें कि मैं सार को प्रदर्शित करने के लिए सरलता के लिए वस्तु शाब्दिक अंकन का उपयोग कर रहा हूं। दुर्भाग्य से चीजों को जावास्क्रिप्ट की तरह भाषाओं में गड़बड़ कर दिया जाता है, जहां errorएक प्रकार नहीं है जो कार्य रचना के संबंध में हम यहां चाहते हैं जिस तरह से व्यवहार करते हैं, जबकि वास्तविक प्रकार इस तरह से व्यवहार करते हैं nullया NaNनहीं करते हैं, बल्कि कुछ कृत्रिम के माध्यम से जाते हैं और हमेशा सहज नहीं होते हैं रूपांतरण लिखें।
एक्सटेंशन टाइप करें
जैसा कि हम अपने अपवाद के अंदर संदेश को अलग करना चाहते हैं, हम वास्तव Eमें पूरे अपवाद ऑब्जेक्ट के लिए एक नए प्रकार की घोषणा कर रहे हैं और फिर वही होता है maybe number, जो इसके भ्रामक नाम के अलावा होता है, जो या तो numberनए अपवाद प्रकार का होना चाहिए E, तो यह वास्तव में संघ है number | Eकी numberऔर E। विशेष रूप से, यह इस बात पर निर्भर करता है कि हम कैसे निर्माण करना चाहते हैं E, जिसका नाम में न तो सुझाव दिया गया है और न ही प्रतिबिंबित किया गया है maybe number।
कार्यात्मक रचना क्या है?
यह फ़ंक्शन लेने f: X -> Yऔर g: Y -> Zफ़ंक्शन को h: X -> Zसंतोषजनक बनाने के लिए उनकी रचना का गणितीय संचालन है
h(x) = g(f(x))। इस परिभाषा के साथ समस्या तब होती है जब परिणाम f(x)को तर्क के रूप में अनुमति नहीं दी जाती है g।
गणित में उन कार्यों को बिना अतिरिक्त काम के नहीं बनाया जा सकता है। हमारे उपरोक्त उदाहरण के लिए सख्ती से गणितीय समाधान है fऔर परिभाषा की परिभाषा के सेट से gदूर करना 0है f। परिभाषा के उस नए सेट (नए और अधिक प्रतिबंधक प्रकार x) के साथ, के fसाथ रचना हो जाती है g।
हालांकि, यह fउस तरह की परिभाषा के सेट को प्रतिबंधित करने के लिए प्रोग्रामिंग में बहुत व्यावहारिक नहीं है। इसके बजाय, अपवादों का उपयोग किया जा सकता है।
या फिर एक और दृष्टिकोण के रूप में, कृत्रिम मूल्यों की तरह बनाई गई हैं NaN, undefined, null, Infinityआदि तो तुम का मूल्यांकन 1/0करने के लिए Infinityऔर 1/-0करने के लिए -Infinity। और फिर अपवाद को फेंकने के बजाय नए मूल्य को अपनी अभिव्यक्ति में वापस लाएं। परिणामों के लिए अग्रणी आपको अनुमान लगाने योग्य नहीं मिल सकता है या नहीं:
1/0 // => Infinity
parseInt(Infinity) // => NaN
NaN < 0 // => false
false + 1 // => 1
और हम आगे बढ़ने के लिए तैयार नियमित संख्याओं में वापस आ रहे हैं;)
जावास्क्रिप्ट हमें उपरोक्त उदाहरण के रूप में त्रुटियों को फेंकने के बिना किसी भी कीमत पर संख्यात्मक अभिव्यक्तियों को निष्पादित करने की अनुमति देता है। इसका मतलब है कि, यह कार्यों की रचना करने की भी अनुमति देता है। जो वास्तव में मोनाड के बारे में है - यह इस उत्तर की शुरुआत के रूप में स्वयंसिद्धों को संतुष्ट करने वाले कार्यों की रचना करने के लिए एक नियम है।
लेकिन संख्यात्मक त्रुटियों से निपटने के लिए जावास्क्रिप्ट के कार्यान्वयन से उत्पन्न होने वाले समारोह की रचना का नियम है?
इस प्रश्न का उत्तर देने के लिए, आपको सभी स्वयंसिद्धों की जांच करनी है (यहाँ प्रश्न के भाग के रूप में व्यायाम नहीं किया गया है;)।
क्या एक मोनड के निर्माण के लिए अपवाद फेंकने का उपयोग किया जा सकता है?
वास्तव में, एक अधिक उपयोगी मोनाड यह नियम निर्धारित करेगा कि यदि fकुछ के लिए अपवाद फेंकता है x, तो इसकी रचना किसी के साथ भी होती है g। प्लस Eकेवल एक संभव मूल्य ( श्रेणी सिद्धांत में टर्मिनल ऑब्जेक्ट ) के साथ विश्व स्तर पर अद्वितीय बनाते हैं । अब दो स्वयंसिद्ध तुरन्त जांचने योग्य हैं और हमें एक बहुत उपयोगी मोनाड मिलता है। और नतीजा यह है कि शायद मोनाड के रूप में अच्छी तरह से जाना जाता है ।