En lisant sur les classes de types, j'ai vu que la relation entre les foncteurs, les foncteurs applicatifs et les monades est celle d'une puissance strictement croissante. Les foncteurs sont des types qui peuvent être transposés. Les foncteurs applicatifs peuvent faire la même chose avec les types certains effets. Monades : même chose avec éventuellement non restrictif effets. De plus :
Every Monad is an Applicative Functor
Every Applicative Functor is a Functor
La définition du foncteur applicatif le montre clairement avec :
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
Mais la définition de Monad est :
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
Selon le grand livre de Brent Yorgey. typclassopédie qu'une définition alternative de la monade pourrait être :
class Applicative m => Monad' m where
(>>=) :: m a -> (a -> m b) -> m b
ce qui est évidemment plus simple y cimenterait que Functor < Applicative Functor < Monad. Alors pourquoi ce n'est pas la définition ? Je sais que les foncteurs applicatifs sont nouveaux, mais d'après la définition des Rapport Haskell 2010 page 80, cela n'a pas changé. Pourquoi cela ?