私は困惑しています。私はこれを書くことができます:折り畳み、機能構成、モナド、そして怠惰、ああ、私?
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
のモナド類似体だと思ったが、明らかに彼らは私が思ったように類似していなかった。なぜ説明できますか?