type InterpreterMonad = StateT (MEMORY, FUNCTIONS) (ReaderT (NameAddress, NameAddress) (ErrorT String IO))
interpreteStmt :: Stmt -> InterpreterMonad()
handleFCall :: VarName -> [CallArg] -> InterpreterMonad()
handleFCall (VarName name) argsCall = do
(memory, functions) <- get
case (Map.lookup (VarName name) functions) of
Nothing -> throwError $ "error"
(Just ((DefFun varname argsDef typ begin statements end), env)) -> (checkCoherenceTypesArgs varname argsDef argsCall) >>= \_ -> argsToContext argsDef argsCall env >>= \_ -> interpreter statements >>= \_ -> return()
Ich nicht ganzen Code setzen, um mein Problem klarer zu machen. Und jetzt möchte ich Reader Monad (ich meine Umgebung in Reader) in handleFCall
Funktion für interpreter statements
ändern. Wie es geht?Monad Stack und modifizieren Leser Umgebung
P.S. Mein Versuch: (Es funktioniert nicht, bitte zu erklären, warum)
argsToContext :: [DefArg] -> [CallArg] -> NameAddress -> InterpreterMonad()
argsToContext xs ys env = do
(memory, fs) <- get
(mem, args) <- (argsToContext' xs ys memory Map.empty)
put (mem, fs)
throwError $ "Tutej " ++ (show args) ++ " memory " ++ (show mem)
local (\_ -> (env, args)) ask
return()
hinweis: '>> = \ _ -> ..' ist das gleiche wie' >> ', auch ist es ratsam, um eine Zeile Länge von mehr oder weniger 80 Zeichen zu halten, um Ihren Code lesbar zu machen. – epsilonhalbe
Beachten Sie auch, dass 'local (\ _ -> ...) ask 'nichts bewirkt. Die Umgebung wird nur für das 'ask' modifiziert - nach der Rückkehr wird die Leserumgebung sozusagen" wiederhergestellt ". Siehe meine Antwort für ein Beispiel dafür. – ErikR