J'essaye de comprendre la motivation derrière la MonadPlus
. Pourquoi est-ce nécessaire s'il existe déjà des classes de type Monad
et Monoid
?
Accordé, les instances de Monoid
sont des types concrets, tandis que les instances de Monad
nécessitent un seul paramètre de type. (Voir Monoïde et MonadPlus pour une explication utile). Mais ne pouvez-vous pas réécrire toute contrainte de type de
(MonadPlus m) => ...
comme une combinaison de Monad
et Monoid
?
(Monad m, Monoid (m a)) => ...
Prenez le guard
de la fonction Control.Monad
par exemple. Sa mise en œuvre est :
guard :: (MonadPlus m) => Bool -> m ()
guard True = return ()
guard False = mzero
J'ai pu l'implémenter en utilisant seulement Monad
et Monoid
:
guard' :: (Monad m, Monoid (m ())) => Bool -> m ()
guard' True = return ()
guard' False = mempty
Quelqu'un pourrait-il clarifier la différence réelle entre MonadPlus
et Monad
+ Monoid
?