मुझे परेशान है। मैं इसे लिख सकता हूं:तह, फंक्शन संरचना, मोनैड, और आलस्य, ओह मेरे?
import Control.Monad
main = print $ head $ (foldr (.) id [f, g]) [3]
where f = (1:)
g = undefined
और आउटपुट 1
है। यही कारण है कि समझ में आता है, क्योंकि यह करने के लिए कम कर देता है:
main = print $ head $ ((1:) . undefined . id) [3]
main = print $ head $ (1:) ((undefined . id) [3])
main = print $ head $ 1 : ((undefined . id) [3])
main = print $ 1
लेकिन अगर मैं एक अस्पष्ट समान monadic तकनीक का उपयोग करें, यह एक ही काम नहीं करता:
import Control.Monad
main = print $ (foldr (<=<) return [f, g]) 3
where f = const Nothing
g = undefined
यह prelude.Undefined
पूरी करता है। कौन सा, अजीब है क्योंकि मैं इसे कम करने के लिए उम्मीद करेंगे:
main = print $ ((const Nothing) <=< undefined <=< return) 3
main = print $ return 3 >>= undefined >>= (\_ -> Nothing)
main = print $ Nothing -- nope! instead, undefined makes this blow up
हालांकि, रचना के आदेश flipping:
import Control.Monad
main = print $ (foldr (>=>) return [f, g]) 3
where f = const Nothing
g = undefined
की उम्मीद कम सर्किटिंग पूरा करता है और Nothing
पैदा करता है।
main = print $ (const Nothing >=> undefined >=> return) 3
main = print $ (const Nothing 3) >>= undefined >>= return
main = print $ Nothing >>= undefined >>= return
main = print $ Nothing
मैं दो दृष्टिकोण की तुलना मान लें कि हो सकता है किया गया की तुलना सेब और संतरे है, लेकिन आप अंतर की व्याख्या कर सकते? मैंने सोचा कि f <=< g
f . g
पर मोनैडिक एनालॉग था, लेकिन जाहिर है, जैसा कि मैंने सोचा था उतना ही वैसा ही नहीं है। क्या आप व्यख्या कर सकते हैं?