0
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()
問題をより明確にするためにコード全体を入れない。 そして、私はhandleFCall
のinterpreter statements
の関数でReader monad(私はReaderの環境を意味します)を変更したいと思います。どうやってするの?Monadをスタックして変更するリーダーの環境
P.S.私の試み:(それは動作しません、理由を説明してください)
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()
注: '>> = \ _ - > ..'は'> 'と同じですが、コードを読みやすくするために80字以下の長さの文字列を使用することをお勧めします。 – epsilonhalbe
また、 'local(\ _ - > ...)ask'は何もしません。環境は 'ask'のためだけに変更されています。私の答えはその例を見てください。 – ErikR