2016-03-19 6 views
15

मैं जावास्क्रिप्ट में यूनिट फ़ंक्शन को समझने के साथ संघर्ष कर रहा हूं। विशेष रूप से क्योंकि जिस चीज ने मुझे 'मिल' मोनाड्स (या कम से कम मैंने सोचा था) वादा वस्तु थी, और thenthen पर आपके द्वारा किए गए कार्यों के बावजूद, के बराबर है, इस पर ध्यान दिए बिना then हमेशा एक नया वादा करता है या हैकेल में >>=। यह पूरी तरह से मुझे समझ में आता है, क्योंकि यह सुनिश्चित करता है कि आपके सभी कार्यों को 'मोनड ब्रह्मांड' में निष्पादित किया गया है, ताकि बोल सकें।जेएस मोनाड यूनिट फ़ंक्शन

डगलस क्रॉकफ़ोर्ड द्वारा 'मोनाड्स एंड गोनाड्स' टॉकिंग मुझे क्या चल रहा है। उनके कार्यान्वयन में, bind सीधे ट्रांसफॉर्म फ़ंक्शन का परिणाम देता है, बिना जांच के, क्या परिणाम एक मोनड है। यह वादे के then विधि के साथ संघर्ष करता है, then हमेशा एक नया वादा करता है।

एक विचार लिफ्ट विधि थी। उनके कार्यान्वयन से यह सुनिश्चित होता है कि 'लिफ्ट' हमेशा एक मोनड लौटाएगा, और शायद then वादा करने के लिए उठाया गया था। हालांकि, इसका मतलब यह होगा कि then !== bind, और वादा का कहीं आंतरिक बंधन है।

मेरा अंतर्ज्ञान यह है कि कम से कम किसी प्रकार का प्रकार जांचना चाहिए जो परिवर्तन के परिणाम की जांच करता है, और परिणामस्वरूप मोनैड को जाने देता है, लेकिन गैर-मोनैड को रोक देगा और उन्हें पार करेगा यूनिट फिर से, जैसे 'लिफ्ट' करता है।

* संपादित
इसके अलावा, मैं धारणा है कि thenbind, 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

उन दो संदर्भ विशेष रूप से मेरे लिए चमत्कार किया है। उम्मीद है कि हर किसी की भी मदद करता है।

+14

मैं दृढ़ता से आप इस Crockford बात/कोड की अनदेखी सलाह देते हैं। वादे से आपकी समझ उचित है। आपको इसे एक * अच्छा * संकेतक मिलना चाहिए जो आपको क्रॉकफोर्ड की बात उलझन में डालता है क्योंकि वह उलझन में है। –

+3

'तो' एक मोनड का एक भयानक कार्यान्वयन है। यह 'बाइंड'/'चेन' /' फ्लैटमैप 'मिश्रण करता है/जो भी आप इसे सामान्य' मानचित्र 'के साथ कहते हैं, और यह किसी भी अस्थिरता को वापसी मान के रूप में स्वीकार करता है। हास्केल में, आपको बिल्कुल 'isMonad' की आवश्यकता नहीं है, क्योंकि संकलक पहले से ही जांचता है कि आपके द्वारा पारित फ़ंक्शन में सही रिटर्न प्रकार है। – Bergi

+4

"क्रॉकफोर्ड को अनदेखा करें" के लिए एक और सिफारिश जोड़ें। – naomik

उत्तर

1

मैं काफी आपका प्रश्न क्या है नहीं मिलता है, लेकिन मैं कुछ ऐसा मान चाहते हैं:

एक इकाई की सही परिभाषा क्या है और यह जे एस के मामले में दो तरीकों है?

में हास्केल शर्तें (https://en.wikibooks.org/wiki/Haskell/Understanding_monads से लिया गया), यह आसान है:

return :: a -> m a 
    (>>=) :: m a -> (a -> m b) -> m b 

    (>>) :: m a -> m b -> m b 

जावास्क्रिप्ट शब्दों के लिए, देखो आगे नहीं, छोटे और सरल जवाब यहाँ https://github.com/fantasyland/fantasy-land#monad अन्य जुड़े के साथ है एफपी परिभाषाएं।

तरीकों पर कुछ शब्द:

  1. एक बात है, क्योंकि यह की तरह है, unit (में return हास्केल) एक इकाई का उत्पादन (ठीक इकाई नहीं है, लेकिन तर्क की खातिर ...) चाहिए एक कन्स्ट्रक्टर जो कंटेनर के अंदर एक मूल्य डालता है। Array.of() एक उदाहरण है, jQuery() एक और है, और निश्चित रूप से new Promise() भी है।

    में फंतासी भूमि विशिष्टता यह of() फ़ंक्शन/विधि है।

  2. दूसरा एक महत्वपूर्ण है, जबकि दूसरों (fmap, join) पर आधारित हैं उन्हें फार्म की वजह से ही हास्केलunit और bind होने इकाई की एक परिभाषा का उपयोग करता है।

    हास्केल केbindकाल्पनिक भूमि विशिष्टता में chain नाम पर है क्योंकि bind, जावास्क्रिप्टमें Function.prototype पर ललकारा है, ताकि किसी को लगा कि chain काफी निकट होगा।

    और कारण है कि bind अर्थात chain एक ही प्रकार के एक इकाई लौटने "चाहिए" (>>=) :: m a -> (a -> m b) -> m b की वजह से है। संक्षेप में, हास्केल काbind फ़ंक्शन केवल एक फ़ंक्शन स्वीकार करना होगा जो एक मोनड (यह भाग a -> m b) देता है, इसलिए आप इसका परिणाम प्राप्त कर रहे हैं।

  3. हास्केल केthen

    एक मात्र सुविधा

    और

    है

    दृश्यों दो monadic कार्यों जब दूसरी कार्रवाई पहले का परिणाम शामिल नहीं है, जो आईओ जैसे monads के लिए आम है।

अभ्यास में:

  1. यह जे एस में आप सताना सकता है, क्योंकि कोई सख्त प्रकार प्रवर्तन, कि आप हमेशा नियमों का पालन नहीं कर सकते हैं और जो कुछ भी आप चाहते हैं वापसी एक Promise से उदाहरण के लिए, इस प्रकार वादे के .then() श्रृंखला को तोड़ना।

  2. jQuery जैसे कुछ मोनैड ने "उठाए" कार्यों को ऐसे तरीके के रूप में लिया है जो हमेशा उसी प्रकार के jQuery यानी लौटने की क्षमता को "सुरक्षा" करते हैं।

संबंधित मुद्दे