तेजी से पाठकों का सम्मान करने के लिए, मैं पहले सटीक परिभाषा के साथ शुरू करता हूं, त्वरित "सादे अंग्रेजी" स्पष्टीकरण के साथ जारी रखता हूं, और फिर उदाहरणों पर जाता हूं।
यहाँ थोड़ा संक्षिप्त रूप में संक्षिप्त और सटीक परिभाषा है:
एक मोनड (कंप्यूटर विज्ञान में) औपचारिक रूप से एक मानचित्र है जो:
हर प्रकार 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
भेजकर संशोधन करते हैं जिसे हम अपवाद कहते हैं। हम यह सुनिश्चित करते हैं कि मूल्य में कोई बाहरी जानकारी नहीं है जो हमारे इनपुट द्वारा विशिष्ट रूप से निर्धारित नहीं है, जो है । तो यहाँ साइड इफेक्ट के बिना अपवाद का एक उदाहरण है:0
e
e
x
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
केवल एक संभव मूल्य ( श्रेणी सिद्धांत में टर्मिनल ऑब्जेक्ट ) के साथ विश्व स्तर पर अद्वितीय बनाते हैं । अब दो स्वयंसिद्ध तुरन्त जांचने योग्य हैं और हमें एक बहुत उपयोगी मोनाड मिलता है। और नतीजा यह है कि शायद मोनाड के रूप में अच्छी तरह से जाना जाता है ।