Ich versuche die Motivation hinter dem MonadPlus
zu verstehen. Warum ist es notwendig, wenn bereits die Typklassen Monad
und Monoid
vorhanden sind?Warum MonadPlus und nicht Monad + Monoid?
Zugegeben, Instanzen von Monoid
sind konkrete Typen, während Instanzen von Monad
einen einzelnen Typparameter erfordern. (Siehe Monoid vs MonadPlus für eine hilfreiche Erklärung.) Aber könnte man umschreiben keinerlei Einschränkung von
(MonadPlus m) => ...
als eine Kombination von Monad
und Monoid
?
(Monad m, Monoid (m a)) => ...
Nehmen Sie die guard
Funktion von Control.Monad
, zum Beispiel. Seine Umsetzung ist:
guard :: (MonadPlus m) => Bool -> m()
guard True = return()
guard False = mzero
ich es umsetzen konnte nur mit Monad
und Monoid
:
guard' :: (Monad m, Monoid (m())) => Bool -> m()
guard' True = return()
guard' False = mempty
Könnte jemand bitte den wirklichen Unterschied zwischen MonadPlus
und Monad
+ Monoid
klären?
Wenn es Ihnen nichts ausmacht würde ich gerne ein konkretes Beispiel hier sehen. Können Sie einige Instanzen mit bestimmten Monaden bereitstellen, in denen MonadPlus nützlicher oder sauberer ist als Monoid? – Fresheyeball
@Fresheyeball: Nein, ich kann "einige Instanzen mit bestimmten Monads" nicht anbieten, sorry. Wenn die Monade bekannt ist, besteht keine Notwendigkeit, über m zu abstrahieren, und es ist nicht notwendig, irgendwelche Typklassen zu verwenden, um die erwartete Schnittstelle von m zu spezifizieren, so dass der Unterschied zwischen MonadPlus und Monoid nicht wirklich von Bedeutung ist funktioniert nur mit einer bestimmten Monade. – Toxaris
Ich verstehe das. Aber es ist schwierig, die Praxis zu verstehen, ohne zu sehen, wie bestimmte Monaden mit verallgemeinerten Codes arbeiten würden. – Fresheyeball