我在尝试将读写语句合并到evaluateStatementInner
函数中时遇到了一些麻烦。
我尝试更改这两个函数的返回类型,但均未成功。
我正在尝试将类型IO(Env)
转换为Env
. 我知道这可以通过在返回IO
动作的函数中绑定来完成,但我可以在evaluateInner
语句中执行吗?
干杯
评估Read
并且Write
必然涉及执行 i/o。所以咬紧牙关,将类型更改evaluateStatementInner
为Stmt -> 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