При чтении в классах классов я видел, что взаимосвязь между Функторами, Аппликативными Функторами и Монадами - это строго возрастающая сила. Функторы - это типы, которые можно сопоставить. Аппликативные функторы могут делать то же самое с определенными эффектами. Монады одинаковы с возможным неограничивающим эффектом. Более того:
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 < Аппликативный функтор < Монада. Так почему же это не определение? Я знаю, что аппликативные функции новы, но согласно Отчету Haskell 2010, страница 80, это не изменилось. Почему это?