我需要编写一个状态monad,它也可以支持错误处理。我正在考虑使用Either monad来达到这个目的,因为它也可以提供有关导致错误的详细信息。我找到了使用Maybe monad的状态monad的定义,但是我无法修改它来使用Either而不是Maybe。以下是代码:如何编写一个执行错误处理的状态monad?
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}
我没有看到第一个代码块和第二个代码块之间的区别。你是否错误地包含了相同的代码两次,或者,如果不是,你能澄清它们之间的区别吗? – seh 2010-10-31 15:57:34
@seh,良好的捕获,它的更新 – 2010-10-31 16:07:42
还要注意,这两个在操作上有点不同。 第二个版本允许可恢复的错误,而第一个版本终止于第一个错误。如果您正在建模日志记录,请注意第一个版本也会“失去”登录错误。 – 2010-10-31 16:26:11