我在尝试将读写语句合并到evaluateStatementInner
函数时遇到了一些麻烦。
我尝试过更改两种功能的返回类型但没有成功。
我正在尝试将类型IO(Env)
转换为Env
。我知道这可以通过在返回IO
操作的函数中进行绑定来完成,但是我可以在evaluateInner
语句中执行吗?
干杯
答案 0 :(得分:4)
根据需要评估Read
和Write
涉及执行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