Поднимите локальный читатель монад

import Control.Monad.Reader
import Control.Monad.State
import Control.Monad.Error

data Context
data Memory 
data Functions

data InterpreterM a = ExeInterpreter a | PropInterpreter a

newtype InterpreterMT m a = InterpreterMT { runInterpreterMT :: m (InterpreterM a) }
type Interpreter = InterpreterMT (StateT (Memory, Functions) (ReaderT (Context, Context) (ErrorT String IO)))

data Stmt
data Stmts = EmptyStmts | Statements Stmt Stmts

interpretStmt :: Stmt -> Interpreter Context

interpreter :: Stmts -> Interpreter ()
interpreter EmptyStmts = return () 
interpreter (Statements s stmts) = do
    currEnv <- interpretStmt s
    local (\(prev, _) -> (prev, currEnv)) $ interpreter stmts

Проблема в последней строке - подъема нет - я это знаю. Но я не знаю, как поставить здесь подъемную силу, потому что мои эксперименты тоже дают мне ошибки. Я прошу помощи.


person Gilgamesz    schedule 12.05.2016    source источник
comment
Как насчет того, чтобы рассказать нам о своих экспериментах, в том числе об ошибках, которые они вызывают?   -  person leftaroundabout    schedule 12.05.2016
comment
Думаю, проблема в том, что Interpreter не является Monad.   -  person arrowd    schedule 12.05.2016
comment
Почему вы находите, что Interpreter не является монадой?   -  person Gilgamesz    schedule 12.05.2016


Ответы (1)


Если вы хотите, чтобы такая функция, как local, была поднята до внутренней монады, вам нужен класс функций map...T.

Например, если у вас есть WriterT [String] (ReaderT Int (Either String)) a и вы хотите запустить something с другой средой чтения:

mapWriterT (local (+1)) something
person Mart    schedule 21.08.2020