実は(常識?)
instance Monad ((->) r) where
return = const
f >>= k = \ r -> k (f r) r
なので
f x = hoge (fuga x) x
は
f = hoge =<< fuga
になる。
よく(<*>)を使う気がするが、>>=はPreludeに入っているので良いのではと思った。
詰まった時に、ポイントフリーに直してくれるツール
http://pointfree.io/
を使ってみたところ変換されて「へぇ!」と思った。
(>>=) :: forall a b. m a -> (a -> m b) -> m b
(=<<) :: Monad m => (a -> m b) -> m a -> m b