Ho bisogno di scrivere una monade di stato che supporti anche la gestione degli errori. Stavo pensando di usare l'Either Monad per questo scopo perché può anche fornire dettagli su cosa ha causato l'errore. Ho trovato una definizione per una monade di stato usando la monad Forse, ma non sono in grado di modificarla per usare E, invece di Forse. Ecco il codice:Come posso scrivere una monade di stato che gestisce anche la gestione degli errori?
newtype StateMonad a = StateMonad (State -> Maybe (a, State))
instance Monad StateMonad where
(StateMonad p) >>= k = StateMonad (\s0 -> case p s0 of
Just (val, s1) -> let (StateMonad q) = k val in q s1
Nothing -> Nothing)
return a = StateMonad (\s -> Just (a,s))
data State = State
{ log :: String
, a :: Int}
Non vedo la differenza tra il primo blocco di codice e il secondo. Hai erroneamente incluso lo stesso codice due volte o, in caso contrario, puoi chiarire la differenza? – seh
@seh, buona cattura, è aggiornato –
Si noti inoltre che questi due sono operativamente un po 'diversi. La seconda versione consente di ripristinare gli errori, mentre la prima versione termina con il primo errore. Se si sta eseguendo la modellazione della registrazione, tenere presente che la prima versione "perde" anche l'errore di accesso. –