関数(a->b)はそのままArrowのインスタンスになっているわけなんですが、実はモナドのインスタンスとしても機能できることに気づきました… ステートモナドとかを見れば何の秘密にもなっていないことなんですが…「関数もモナドのインスタンスとして扱える」という認識が今まではっきりとはなかったのでちょっとインパクトがありました… ということでやってみました: newtype MonadF i o = MonadF {runMF :: i -> o} instance Monad (MonadF i) where return a = MonadF $ const a (MonadF af) >>= b = MonadF $ \i -> (runMF $ b $ af i) i instance Functor (MonadF i) where fmap f (MonadF mf) = Monad