मैं जावास्क्रिप्ट में यूनिट फ़ंक्शन को समझने के साथ संघर्ष कर रहा हूं। विशेष रूप से क्योंकि जिस चीज ने मुझे 'मिल' मोनाड्स (या कम से कम मैंने सोचा था) वादा वस्तु थी, और then
then
पर आपके द्वारा किए गए कार्यों के बावजूद, के बराबर है, इस पर ध्यान दिए बिना then
हमेशा एक नया वादा करता है या हैकेल में >>=
। यह पूरी तरह से मुझे समझ में आता है, क्योंकि यह सुनिश्चित करता है कि आपके सभी कार्यों को 'मोनड ब्रह्मांड' में निष्पादित किया गया है, ताकि बोल सकें।जेएस मोनाड यूनिट फ़ंक्शन
डगलस क्रॉकफ़ोर्ड द्वारा 'मोनाड्स एंड गोनाड्स' टॉकिंग मुझे क्या चल रहा है। उनके कार्यान्वयन में, bind
सीधे ट्रांसफॉर्म फ़ंक्शन का परिणाम देता है, बिना जांच के, क्या परिणाम एक मोनड है। यह वादे के then
विधि के साथ संघर्ष करता है, then
हमेशा एक नया वादा करता है।
एक विचार लिफ्ट विधि थी। उनके कार्यान्वयन से यह सुनिश्चित होता है कि 'लिफ्ट' हमेशा एक मोनड लौटाएगा, और शायद then
वादा करने के लिए उठाया गया था। हालांकि, इसका मतलब यह होगा कि then !== bind
, और वादा का कहीं आंतरिक बंधन है।
मेरा अंतर्ज्ञान यह है कि कम से कम किसी प्रकार का प्रकार जांचना चाहिए जो परिवर्तन के परिणाम की जांच करता है, और परिणामस्वरूप मोनैड को जाने देता है, लेकिन गैर-मोनैड को रोक देगा और उन्हें पार करेगा यूनिट फिर से, जैसे 'लिफ्ट' करता है।
* संपादित
इसके अलावा, मैं धारणा है कि then
bind, flatMap, >>=
के बराबर है क्योंकि यह विभिन्न लोगों और उसके अपने प्रकार के लोगों सहित अन्य monads, खोलने की क्षमता है के तहत हूं। जावास्क्रिप्ट में कुछ श्रेणी सिद्धांत संदर्भों को देखते हुए, flatMap
का उपयोग नेस्टेड सरणी के एक सेट पर मैप करने के लिए किया जाता था, और फिर उन्हें एक आयाम से फ़्लैट किया जाता था। यह then
के साथ फिट बैठता है जो आपके द्वारा दिए गए अन्य वादों की प्रतीक्षा करेगा। लेकिन उपर्युक्त मूल कार्यान्वयन के साथ मेल नहीं खा रहा है। मेरे होशोहवास गुम हो गए हैं।
क्या कोई और एफपी अनुभव वाला कोई भी व्यक्ति जो मुझे याद कर रहा है उस पर कुछ प्रकाश डाल सकता है, या मैं अभी भी बहुत दूर हूं, और शुरुआत से ही शुरुआत करने की आवश्यकता है?
कुछ कोड उदाहरण ...
// Crockford's 'bind'
monad.bind = function(transform) {
// value was passed in through the unit constructor
return transform(value);
}
मेरे मुसीबत क्षेत्र
// Set the 'isMonad' prop to be true, for all
// monads made with the MONAD macroid
monad.isMonad = true;
// shouldn't this ALWAYS return a monad?
monad.bind = function(transform) {
var res = transform(value);
return (res && res.isMonad) ? res : unit(res);
}
नोट मैं जानता हूँ कि मैं पूरी तरह से उसके कार्यान्वयन के अंतिम संस्करण का उपयोग नहीं करते, मैं सिर्फ हूँ विशेष रूप से बाध्य विधि में ध्यान केंद्रित।
पूर्ण कार्यान्वयन
https://github.com/douglascrockford/monad/blob/master/monad.js
अद्यतन
में पाया जा सकता कुछ और अधिक शोध करने के बाद, >>=
एक इकाई उदाहरण वापस जाने के लिए आवश्यक नहीं है। बर्गी की टिप्पणी ने कुछ प्रकाश डाला कि कैसे Promise.prototype.then
ओवरलोड हो गया है और आप इसे हल करने के आधार पर एक अलग फ़ंक्शन के रूप में कार्य करते हैं।
इसके अलावा, जब मैंने एक कदम वापस ले लिया और देखा कि मोनाड नियमित मज़दूरों से अलग कैसे हैं, तो बहुत सी चीजों पर क्लिक करना शुरू हो गया। विवरण अभी भी थोड़ा अस्पष्ट हैं, लेकिन मुझे लगता है कि मुझे बड़ी तस्वीर मिलती है।
कुछ अच्छा संदर्भ धुन्ध स्पष्ट मदद की,
यह एक अत्यधिक एक उच्च स्तरीय सिंहावलोकन के लिए सलाह देते हैं होता है, मानव शब्दों में
http://adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html
चित्रों आप मूर्ख मत, यह एक तरह था मेरे लिए सोना जावास्क्रिप्ट में नहीं, लेकिन समग्र अवधारणाओं के बारे में अभी भी बहुत जानकारीपूर्ण है।
इसके अलावा, जावास्क्रिप्ट
https://www.youtube.com/watch?v=-FkgOHvNAU8&list=PLwuUlC2HlHGe7vmItFmrdBLn6p0AS8ALX&index=1
में श्रेणी थ्योरी पर इस यूट्यूब 'श्रृंखला मज़ा मज़ा समारोह' नामक यह यूट्यूब श्रृंखला अद्भुत है, मेजबान सबसे अच्छा शिक्षकों मैं ऑनलाइन पाया है में से एक है। यह वीडियो monads के बारे में है और MrE
द्वारा सुझाव दिया गया था।
अत्यधिक अनुशंसित!
https://www.youtube.com/watch?v=9QveBbn7t_c&app=desktop
उन दो संदर्भ विशेष रूप से मेरे लिए चमत्कार किया है। उम्मीद है कि हर किसी की भी मदद करता है।
मैं दृढ़ता से आप इस Crockford बात/कोड की अनदेखी सलाह देते हैं। वादे से आपकी समझ उचित है। आपको इसे एक * अच्छा * संकेतक मिलना चाहिए जो आपको क्रॉकफोर्ड की बात उलझन में डालता है क्योंकि वह उलझन में है। –
'तो' एक मोनड का एक भयानक कार्यान्वयन है। यह 'बाइंड'/'चेन' /' फ्लैटमैप 'मिश्रण करता है/जो भी आप इसे सामान्य' मानचित्र 'के साथ कहते हैं, और यह किसी भी अस्थिरता को वापसी मान के रूप में स्वीकार करता है। हास्केल में, आपको बिल्कुल 'isMonad' की आवश्यकता नहीं है, क्योंकि संकलक पहले से ही जांचता है कि आपके द्वारा पारित फ़ंक्शन में सही रिटर्न प्रकार है। – Bergi
"क्रॉकफोर्ड को अनदेखा करें" के लिए एक और सिफारिश जोड़ें। – naomik