Отношения между функтором, аппликативным функтором и монадой

Читая о классах типов, я увидел, что отношения между Функторами, Аппликативными Функторами и Монадами строго взаимосвязаны. Функторы - это типы, которые можно отображать. Аппликативные функторы могут делать то же самое сопределенный последствия. Монады то же самое свозможно неограниченно последствия. Кроме того:

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

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

Ответы на вопрос(2)

Ваш ответ на вопрос