2

我在尝试将读写语句合并到evaluateStatementInner函数中时遇到了一些麻烦。

我尝试更改这两个函数的返回类型,但均未成功。

我正在尝试将类型IO(Env)转换为Env. 我知道这可以通过在返回IO动作的函数中绑定来完成,但我可以在evaluateInner语句中执行吗?

干杯

4

1 回答 1

4

评估Read并且Write必然涉及执行 i/o。所以咬紧牙关,将类型更改evaluateStatementInnerStmt -> Env -> IO Env(或者,更好的是,将其直接合并到evaluateStatement中)。

然后,您将需要修改evaluateListOfStatements为 type [Stmt] -> Env -> IO Env


所以这现在给你一个编译错误

case stmt of
...
    While boolExp innerStmt ->
        if evaluateBoolExp boolExp env
            then evaluateStatementInner (While boolExp innerStmt) (evaluateStatementInner innerStmt env)
            else env

因为evaluateStatementInner innerStmt env产生一个IO Env,但evaluateStatementInner (While boolExp innerStmt)想要一个Env

这是 monadic bind 的一种情况(请注意 else 分支也需要更新以具有正确的类型):

case stmt of
...
    While boolExp innerStmt ->
        if evaluateBoolExp boolExp env
            then evaluateStatementInner (While boolExp innerStmt) =<< evaluateStatementInner innerStmt env
            else return env

你可能对一元运算符不满意,所以我将它翻译成 do-notation:

case stmt of
...
    While boolExp innerStmt ->
        if evaluateBoolExp boolExp env
            then do env' <- evaluateStatementInner innerStmt env
                    evaluateStatementInner (While boolExp innerStmt) env'
            else return env
于 2012-06-12T13:48:06.913 回答