Sto cercando di capire le motivazioni alla base dello MonadPlus
. Perché è necessario se ci sono già i typeclasses Monad
e Monoid
?Perché MonadPlus e non Monad + Monoid?
Concesso, le istanze di Monoid
sono tipi concreti, mentre le istanze di Monad
richiedono un singolo parametro di tipo. (Vedere Monoid vs MonadPlus per una spiegazione utile.), Ma non si potrebbe riscrivere qualsiasi tipo di vincolo di
(MonadPlus m) => ...
come una combinazione di Monad
e Monoid
?
(Monad m, Monoid (m a)) => ...
Prendere la funzione guard
da Control.Monad
, per esempio. La sua attuazione è:
guard :: (MonadPlus m) => Bool -> m()
guard True = return()
guard False = mzero
sono stato in grado di attuarlo utilizzando solo Monad
e Monoid
:
guard' :: (Monad m, Monoid (m())) => Bool -> m()
guard' True = return()
guard' False = mempty
Qualcuno potrebbe chiarire la vera differenza tra MonadPlus
e Monad
+ Monoid
?
Se non ti dispiace, mi piacerebbe davvero vedere un esempio concreto qui. Puoi fornire alcune istanze utilizzando Monade specifiche in cui MonadPlus è più utile o più pulito di Monoid? – Fresheyeball
@Fresheyeball: No, non posso fornire "alcune istanze che usano specifiche Monade", mi dispiace. Se la monade è conosciuta, non c'è bisogno di astrarre su m, e non c'è bisogno di usare alcuna classe di tipi per specificare l'interfaccia prevista di m, quindi la differenza tra 'MonadPlus' e' Monoid' non importa se il tuo codice funziona solo con una particolare monade. – Toxaris
Lo capisco. Ma è difficile concettualizzare la pratica senza vedere in che modo specifiche monadi potrebbero funzionare con codice generalizzato. – Fresheyeball