При чтении классов типов я увидел, что отношения между Функторами, Аппликативными Функторами и Монадами строго связаны. Функторы - это типы, которые можно отображать. Аппликативные функторы могут делать то же самое с определенными эффектами. Монады то же самое с возможно неограниченными эффектами. Кроме того:
Every Monad is an Applicative Functor
Every Applicative Functor is a Functor
Определение Аппликативного Функтора ясно показывает это с помощью:
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
Но определение Монада таково:
class Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
m >> n = m >>= \_ -> n
fail :: String -> m a
Согласно великой typeclassopedia Брента Йорги , что альтернативное определение монады может быть:
class Applicative m => Monad' m where
(>>=) :: m a -> (a -> m b) -> m b
что, очевидно, проще и цементирует этот Functor 2010, стр. 80 отчета 2010, это не изменилось. Почему это?