Por que MonadPlus e não Monad + Monoid?
Estou tentando entender a motivação por trás doMonadPlus
. Por que é necessário se já existem as classes de tipoMonad
eMonoid
?
Concedido, instâncias deMonoid
são tipos concretos, enquanto instâncias deMonad
requer um parâmetro de tipo único. (VejoMonoid vs MonadPlus para uma explicação útil.) Mas você não pode reescrever qualquer restrição de tipo de
(MonadPlus m) => ...
como uma combinação deMonad
eMonoid
?
(Monad m, Monoid (m a)) => ...
Levar aguard
função deControl.Monad
, por exemplo. Sua implementação é:
guard :: (MonadPlus m) => Bool -> m ()
guard True = return ()
guard False = mzero
Consegui implementá-lo usando apenasMonad
eMonoid
:
guard' :: (Monad m, Monoid (m ())) => Bool -> m ()
guard' True = return ()
guard' False = mempty
Alguém poderia esclarecer a real diferença entreMonadPlus
eMonad
+ Monoid
?