Haskell递归IO

时间:2012-06-12 11:52:00

标签: haskell io

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

我尝试过更改两种功能的返回类型但没有成功。

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

干杯

1 个答案:

答案 0 :(得分:4)

根据需要评估ReadWrite涉及执行i / o。所以咬紧牙关并将evaluateStatementInner的类型更改为Stmt -> Env -> IO Env(或者,更好,将其直接合并到evaluateStatement)。

然后,您需要将evaluateListOfStatements修改为[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绑定的一种情况(并注意else分支也需要更新以具有正确的类型):

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

您可能对monadic运算符感到不舒服,因此我将其转换为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