डैनियल उत्कृष्ट जवाब देने के लिए जोड़ने के लिए, वहाँ एक जोड़े को अंक मैं करना चाहते हैं कर रहे हैं सर्किटिंग '- जैसे ही यह Left
हिट करता है, यह बंद हो जाता है और बाएं लौटाता है। आप इसे गरीब व्यक्ति के सख्त विश्लेषण के साथ देख सकते हैं:
ghci> (++) <$> Left "Hello" <*> undefined
Left "Hello" -- <<== it's not undefined :) !!
ghci> (++) <$> Right "Hello" <*> undefined
*** Exception: Prelude.undefined -- <<== undefined ... :(
ghci> Left "oops" <*> undefined <*> undefined
Left "oops" -- <<== :)
ghci> Right (++) <*> undefined <*> undefined
*** Exception: Prelude.undefined -- <<== :(
दूसरा, आपका उदाहरण थोड़ा मुश्किल है। सामान्य रूप से, Either e
में फ़ंक्शन का प्रकार और e
संबंधित नहीं है। यहाँ <*>
रों प्रकार है:
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
अगर हम बनाने के प्रतिस्थापन f
- >>Either e
, हम पाते हैं:
(<*>) :: Either e (a -> b) -> Either e a -> Either e b
हालांकि अपने उदाहरण में, e
और a
मैच, सामान्य रूप में वे ऐसा नहीं करेंगी , जिसका अर्थ है कि आप Either e
के लिए एक आवेदक उदाहरण को लागू नहीं कर सकते हैं जो बाएं हाथ के तर्क पर फ़ंक्शन लागू करता है।
स्रोत
2012-12-14 15:13:44
यह या तो पारंपरिक उपयोग है कि राइट उस मूल्य का प्रतिनिधित्व करता है जिसमें आप रुचि रखते हैं, जबकि वाम विफलता का प्रतिनिधित्व करता है। दाएं (सही) मानों को आवेदक और फंक्चर का उपयोग करके संयुक्त और संशोधित किया जा सकता है, जबकि एक बाएं से अधिक खराब मूल्य जिद्दी बने रहेंगे, इसलिए यह पहली त्रुटि की रिपोर्ट करने जैसी चीजों के लिए अच्छा है जैसे कि सरल संकलक हो सकता है। – AndrewC