Quale monade è l'opposto dell'errore monad in haskell

8

Nella monade dell'errore, il primo errore arresta qualsiasi esecuzione ulteriormente portando semplicemente l'errore attraverso i seguenti binding.

Quale monade si ferma sul successo solo portando avanti i successi e fondamentalmente inghiottendo eventuali errori e provando il prossimo legame trascurando il fallimento del precedente?

L'errore monad potrebbe forse essere usato per il fallimento di questo trattamento come il successo, ma sono curioso di sapere se le librerie di default hanno una monade per questo scopo specifico, quasi come una monade O nella mia mente "Fai questo o quello"

Modifica:

Il comportamento sarebbe:

Left "fail" >>= (\x -> Right "win") >>= (\x -> Left "ahh neener") >>= (\x -> Right (x + " yay"))

Nell'errore monade il primo valore a sinistra viene semplicemente portato avanti, quindi il risultato è Left "fail" . Il comportamento che voglio è dove il sopra restituisce Right "win yay" è una monade banale da implementare potrei scrivere me stesso, ma ho pensato che esistesse qualcosa per farlo (forse non usando Either, ma questa è la prima cosa che mi viene in mente per un simile comportamento).

    
posta Jimmy Hoffa 20.01.2013 - 01:29
fonte

1 risposta

4

Ciò di cui hai bisogno è MonadPlus (vedi anche wiki Haskell ). Definisce

mzero :: m a

che rappresenta un errore non specificato e

mplus :: m a -> m a -> m a

che prova il secondo calcolo, se il primo fallisce. Sono disponibili anche alcune funzioni ausiliarie:

-- Extends 'mplus' to lists of computations:
msum :: MonadPlus m => [m a] -> m a
-- Fails a computation conditionally.
guard :: MonadPlus m => Bool -> m ()
-- Filter (fail) computations that don't satisfy the predicate.
mfilter :: MonadPlus m => (a -> Bool) -> m a -> m a

Le istanze di MonadPlus possono essere suddivise in due categorie:

  1. mplus combina tutti i risultati possibili di entrambi i suoi argomenti (soddisfa la legge sulla distribuzione di sinistra). [] e Seq sono probabilmente le uniche istanze con questo comportamento.
  2. mplus seleziona l'argomento di sinistra, se contiene un valore valido, altrimenti seleziona quello giusto (soddisfa la legge di Cattura di sinistra). Le istanze con questo comportamento sono Maybe , Either , STM e IO .

( MonadPlus istanza di Either utilizzata per essere definita in Control.Monad.Error come

instance (Error e) => MonadPlus (Either e) where
    mzero            = Left noMsg
    Left _ 'mplus' n = n
    m      'mplus' _ = m

ma per qualche motivo sembra che manchi nella versione corrente.)

Vedi anche MonadPlus su Wikibooks e definizione MonadPlus per Haskell IO .

    
risposta data 20.01.2013 - 14:07
fonte

Leggi altre domande sui tag