私は困惑しています。私はこれを書くことができます:
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
しかし、漠然と似たモナド手法を使用すると、同じようには機能しません。
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
ただし、構成の順序を反転します。
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
2 つのアプローチを比較すると、リンゴとオレンジを比較することになると思いますが、その違いを説明していただけますか? f <=< g
これは のモナド類似体だと思っていましたが、思ったf . g
ほど類似していないようです。理由を説明できますか?