「return と pure って同じじゃないの?」「Monad クラスの fail って数学的なモナドにはなくない?」 Haskell初心者が引っかかるポイントの一つが、 Monad クラスと Applicative クラスの関係だろう。他にも、 Haskell 2010 の Monad クラスには数学的なモナドと照らし合わせると奇妙な点がいくつかある。 この記事では、近年行われている Monad クラスへの破壊的変更をまとめ、変化の途上にある Monad クラスの理解の一助としたい。 Haskell 2010 での Monad クラスとその問題点 Haskell 2010 Language Report では、 Monad クラスは次のように定義されている: class Monad m where (>>=) :: m a -> (a -> m b) -> m b (>>) :: m