Ich schreibe einen kleinen Interpreter in Haskell, der die StateT-Monade (in Kombination mit IO) und die EatT Monad verwendet. Jetzt möchte ich eine ganzzahlige Funktion auf die Werte anwenden, die von der Funktion interpArithmic interpretiert werden. Aber das Problem ist, dass der interpArithmic selbst auch die EitherT InterpError (StateT Environment IO())
Signatur hat. Wie kann ich die von der interpArithmic-Funktion interpretierten Werte extrahieren, in meiner bAritHelper-Funktion verwenden, sie zusammenaddieren (zB) und dort einen neuen Wert zurückgeben?Erhalte Daten aus 2 Staaten in Haskell
bArithHelper :: Arithmic -> Arithmic -> (Integer -> Integer -> Integer) -> EitherT InterpError (StateT Environment IO Value)
bArithHelper a b func =
-- Body of this function is completely broken, don't know how to fix this.
do
st1 <- interpArithmic a
st2 <- interpArithmic b
return $ do
env1 <- get st1
env2 <- get st2
return Num
liftM $
-- This function interpretes an arithmic expression and returns it's result.
-- An error message (int the form of Error) is returned in case something goes wrong.
interpArithmic :: Arithmic -> Either InterpError (StateT Environment IO Value)
interpArithmic (ConstInteger a) = return (Num a)
interpArithmic (BinaryArithmicExpression Add a b) = bArithHelper a b (\x -> \y -> x + y)
Oder gibt es eine andere Möglichkeit, Fehler zu behandeln und die StateT Monade in Kombination mit IO zu verwenden?
PS: Ich möchte ETA als den äußeren Monade-Transformator behalten, weil ich auf diese Weise keine Art von Fall im Do-Block verwenden muss.
Können Sie die Definitionen der Datentypen Arithmic & Value hinzufügen? Auch InterpError und Environment fehlen, aber das ist weniger wichtig, da Sie sie im Beispiel nicht verwenden – sinelaw