エラー処理もサポートできる状態モナドを書く必要があります。エラーの原因についての詳細も提供できるため、この目的のために、Either モナドを使用することを考えていました。Maybe モナドを使用して状態モナドの定義を見つけましたが、Maybe の代わりに Each を使用するように変更することはできません。コードは次のとおりです。
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}