Почему 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
?