Necesito escribir una mónada de estado que también pueda soportar el manejo de errores. Estaba pensando en utilizar la Mónada de cualquiera para este propósito porque también puede proporcionar detalles sobre qué causó el error. Encontré una definición para una mónada de estado usando la mónada Maybe, sin embargo, no puedo modificarla para usar Either, en vez de Maybe. Aquí está el código:¿Cómo puedo escribir una mónada de estado que también maneje errores?
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}
No veo la diferencia entre el primer bloque de código y el segundo. ¿Incluyó equivocadamente el mismo código dos veces o, de no ser así, puede aclarar la diferencia? – seh
@seh, buena captura, está actualizado –
También tenga en cuenta que estos dos son operacionalmente un poco diferentes. La segunda versión permite errores reanudables, mientras que la primera versión termina en el primer error. Si está modelando el registro, tenga en cuenta que la primera versión también 'pierde' el error de inicio de sesión. –