Почему MonadPlus, а не Monad + Monoid?

Я пытаюсь понять мотивациюMonadPlus, Зачем это нужно, если классы типов уже естьMonad а такжеMonoid?

Конечно, случаиMonoid являются конкретными типами, тогда как случаиMonad требуется параметр одного типа. (УвидетьМоноид против МонадПлюс для полезного объяснения.) Но вы не могли бы переписать какое-либо ограничение типа

(MonadPlus m) => ...

как сочетаниеMonad а такжеMonoid?

(Monad m, Monoid (m a)) => ...

Возьмитеguard функция отControl.Monad, например. Его реализация:

guard :: (MonadPlus m) => Bool -> m ()
guard True = return ()
guard False = mzero

Я смог реализовать это, используя толькоMonad а такжеMonoid:

guard' :: (Monad m, Monoid (m ())) => Bool -> m ()
guard' True = return ()
guard' False = mempty

Может ли кто-нибудь уточнить реальную разницу междуMonadPlus а такжеMonad + Monoid?

Ответы на вопрос(2)

Ваш ответ на вопрос