मैं <$>
के प्रकार हस्ताक्षर के पीछे तर्क को समझता हूं, क्योंकि यह fmap
का सिर्फ एक इंफिक्स संस्करण है, लेकिन इसे >>=
के प्रकार हस्ताक्षर से तुलना करने से यह मुझे बहुत कम समझ में आता है।
आइए पहले स्थापित करें कि मेरा क्या मतलब है।
(>>=) :: Monad m => m a -> (a -> m b) -> m b
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
(<$>) :: Functor f => (a -> b) -> f a -> f b
प्रकार हस्ताक्षर को देखते हुए हम देख सकते हैं कि >>=
बाईं तरफ एक मूल्य लेता है, और सही है, जो भावना है, तो आप अपने चेनिंग संपत्ति पर विचार का एक बहुत बनाता है पर एक समारोह: foo >>= bar >>= baz
कौन सा मुझे आश्चर्य होता है, <*>
और <$>
क्यों नहीं करते? आप foo <*> bar <*> baz
नहीं लिख सकते हैं क्योंकि इसे एक कार्य होने के लिए foo <*> bar
के आउटपुट की आवश्यकता होगी, न कि मूल्य।
मुझे पता है कि <**>
और =<<
मौजूद है कि दोनों मापदंडों के आदेश फ्लिप, मेरे जैसे कुछ करने के लिए अनुमति देता है:
Just 4 <$$> (+3) <$$> (*2) >>= (\x -> Just (x-3))
हैं:
Just 4 <**> pure (+3) <**> pure (*2) >>= (\x -> Just (x-3))
कौन सा खूबसूरती से करने के लिए कम किया जा सकता था <$$>
अस्तित्व में था, या <$>
और <*>
के पैरामीटर आदेश को उलट दिया गया था।
एक और चीज जो मुझे आश्चर्य करती है कि अंतर क्यों मौजूद है, यह है कि यह नवागंतुकों के लिए उपयोग करने के लिए कठिन होता है और/या याद करता है कि यह कार्य है, या जो मूल्य पहले आता है, इसे देखने के बिना।
तो इसे क्यों है कि <*>
और <$>
के मामलों में यह fn op val
है, लेकिन >>=
साथ यह val op fn
है?
लेकिन आप अक्सर 'Applicatives' के साथ इस वास्तव में चाहते हैं : उदाहरण के लिए '(+) <$> बस 5 <*> बस 5 ' <- वह 'बस' सुंदर नहीं है;) – Carsten
'(>> =) 'चेन" अनिवार्य शैली "बनाता है (अन्यथा हम सोचते रहेंगे क्यों यह नहीं है '$' के समान आदेश)। '(<= <) 'चेनिंग -" '(।)' शैली" भी अनुमति देता है। '(<*>) 'बहु-तर्क कार्यों" लागू करने "के लिए उपयोगी है - घोषणा के क्रम में तर्क प्रदान करना। –
असली सवाल यह है कि क्यों '(>> =)' हास्केल में काफी कुछ सबकुछ के विपरीत एक ऑर्डर का उपयोग कर रहा है। '(= <<) का प्रकार :: मोनाड एम => (ए -> एमबी) -> (एम -> एमबी) '' (>> =) = फ्लिप की तुलना में हास्केल में बाकी सब कुछ जैसा दिखता है (= <<) '। –