मैं जावास्क्रिप्ट में अपने फ़ंक्शन इंस्टेंस को कार्यान्वित करके Applicative
s और Monad
s की मेरी समझ में सुधार करने की कोशिश कर रहा हूं। हास्केल का मेरा ज्ञान सीमित है और मुझे उम्मीद है कि मेरा प्रश्न बिल्कुल समझ में आता है।फ़ंक्शन इंस्टेंस के बाइंड/>> = की व्याख्या कैसे करें?
यहाँ जावास्क्रिप्ट में fmap
, <*>
और >>=
Functor
, Applicative
और Monad
typeclasses के लिए की मेरी कार्यान्वयन हैं:
const fmap = f => g => x => f(g(x)); // B combinator
const apply = f => g => x => f(x) (g(x)); // S combinator
const bind = f => g => x => g(f(x)) (x); // ?
मुझे यकीन है कि है कि क्या bind
हास्केल कार्यान्वयन के सही अनुवाद है नहीं कर रहा हूँ
(>>=) :: (r -> a) -> (a -> (r -> b)) -> r -> b
instance Monad ((->) r) where
f >>= k = \ r -> k (f r) r
प्रदान किया गया कि bind
सही है, इसका अर्थ कैसे है? मुझे पता है कि Applicative
प्रभावशाली गणनाओं का अनुक्रम कर सकता है। मुझे यह भी पता है कि Monad
इसके अलावा आप पिछले एक के परिणाम के अनुसार एक अगला प्रभाव निर्धारित करने की अनुमति देता है।
apply
:मैं दृश्यों (जावास्क्रिप्ट में उत्सुक मूल्यांकन आदेश) देख सकते हैं
f(x)
...g(result of f)
:f(x)
...g(x)
...lambda(result of g)
...lambda
bind
का परिणाम ...lambda(x)
...lambda
हालांकि का परिणाम है, bind
मज़ा कथन बहुत अजीब लग रहा है। f
और g
अन्य तरीकों से घोंसला क्यों हैं? इस कार्यान्वयन में विशिष्ट Monad
व्यवहार (पिछले एक के अनुसार अगला प्रभाव निर्धारित करता है) कैसा है? वास्तव में g(f(x)) (x)
फ़्लिप किए गए तर्कों के साथ एक फ़ंक्शन संरचना की तरह दिखता है, जहां g
एक बाइनरी फ़ंक्शन है।
जब मैं apply
/bind
को एक यूनरी और बाइनरी फ़ंक्शन के साथ लागू करता हूं, तो वे एक ही परिणाम प्राप्त करते हैं। यह ज्यादा समझ में नहीं आता है।
'बाइंड' (जिसे जेएस में 'चेन' के नाम से जाना जाता है) के उपयोगी अनुप्रयोग के लिए [इस उदाहरण] (http://stackoverflow.com/q/40026018/1048572) पर एक नज़र डालें – Bergi