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?

questionAnswers(2)

yourAnswerToTheQuestion