gpt4 book ai didi

Haskell 递归 IO

转载 作者:行者123 更新时间:2023-12-04 18:19:26 27 4
gpt4 key购买 nike

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

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

我正在尝试转换类型 IO(Env)进入 Env .我知道这可以通过在返回 IO 的函数中进行绑定(bind)来完成。行动,但我可以在 evaluateInner 中执行吗?陈述?

干杯

最佳答案

评估 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 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

关于Haskell 递归 IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10996098/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com