Relação entre Functor, Functor Aplicável e Monad
Ao ler sobre as classes de tipos, vi que o relacionamento entre Functors, Functors e Monads é o de aumentar estritamente o poder. Functors são tipos que podem ser mapeados. Os Functors aplicáveis podem fazer as mesmas coisas com certos efeitos. Mônadas o mesmo compossibly irrestrictive efeitos. Além disso
Every Monad is an Applicative Functor
Every Applicative Functor is a Functor
A definição do Functor Aplicável mostra isso claramente com:
class Functor f => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
Mas a definição de Mônada é:
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
De acordo com o ótimo @ de Brent Yorg typeclassopedia que uma definição alternativa de mônada poderia ser:
class Applicative m => Monad' m where
(>>=) :: m a -> (a -> m b) -> m b
que é obviamente mais simples cimentaria esse Functor <Functor Aplicável <Mônada. Então, por que essa não é a definição? Eu sei que os functores aplicativos são novos, mas de acordo com o Relatório Haskell 2010 página 80, isso não mudou. Por que é isso