Отношения между функтором, аппликативным функтором и монадой
Читая о классах типов, я увидел, что отношения между Функторами, Аппликативными Функторами и Монадами строго взаимосвязаны. Функторы - это типы, которые можно отображать. Аппликативные функторы могут делать то же самое сопределенный последствия. Монады то же самое свозможно неограниченно последствия. Кроме того:
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, это не изменилось. Почему это?