Ich muss eine Statusmonade schreiben, die auch die Fehlerbehandlung unterstützen kann. Ich dachte an die Verwendung der Entweder-Monade für diesen Zweck, weil es auch Details darüber geben kann, was den Fehler verursacht hat. Ich habe eine Definition für eine staatliche Monade gefunden, die die Maybe-Monade verwendet, aber ich bin nicht in der Lage, sie so zu modifizieren, dass sie entweder statt Maybe verwendet. Hier ist der Code:Wie kann ich eine Zustands-Monade schreiben, die Fehlerbehandlung auch tut?
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}
Ich sehe den Unterschied zwischen dem ersten Codeblock und dem zweiten nicht. Haben Sie versehentlich den gleichen Code zweimal eingegeben oder, wenn nicht, können Sie den Unterschied klären? – seh
@seh, guter Fang, es ist aktualisiert –
Beachten Sie auch, dass diese beiden operativ ein wenig anders sind. Die zweite Version ermöglicht fortsetzbare Fehler, während die erste Version beim ersten Fehler endet. Wenn Sie die Protokollierung modellieren, sollten Sie beachten, dass die erste Version auch den Anmeldefehler "verliert". –