haskell - 如何处理Haskell中递归函数中的侧IO操作?
问题描述
我是 Haskell 的新手。我想知道为什么这段代码:
main :: IO ()
main = run theWorld presentationIO
run dom showDom = do
event <- readCommand
dom' <- updateDomain dom event
showDom dom'
run dom' showDom
..不起作用以及如何解决它。错误是:
simpleExampleTextGameV.0.2.hs:96:16: error:
• Couldn't match expected type ‘IO World’ with actual type ‘World’
• In a stmt of a 'do' block: dom' <- updateDomain dom event
In the expression:
do event <- readCommand
dom' <- updateDomain dom event
showDom dom'
run dom' showDom
In an equation for ‘run’:
run dom showDom
= do event <- readCommand
dom' <- updateDomain dom event
showDom dom'
....
|
96 | dom' <- updateDomain dom event
| ^^^^^^^^^^^^^^^^^^^^^^
为了重现它,您可以启动其余代码: https ://github.com/agutie58/landOfLispInHaskell/blob/main/simpleExampleTextGameV.0.2.hs
提前致谢!
解决方案
第66 行updateDomain
定义的函数返回。World
但是第96 行的“左箭头”需要箭头右侧的一元值,在当前单子中,在您的情况下是IO
.
所以这意味着updateDomain
应该 return IO World
,而不仅仅是,如果你想在块World
中的左箭头的右侧使用它。do
然而,正确的解决方案不是updateDomain
返回IO World
,而是放下左箭头。相反,使用let
绑定dom'
:
run dom showDom = do
event <- readCommand
let dom' = updateDomain dom event
showDom dom'
run dom' showDom
推荐阅读
- html - 换行时如何使“文本对齐:左”居中?
- python - 将元组列表(不同长度)转换为字典
- react-native - react native:在scrollView中使用stickyHeaderIndices时如何知道组件是粘性的
- vba - 需要来自 DB 中另一个表的数据来生成电子邮件而无需额外查询
- node.js - 在 Node JS 中注册相同的事件监听器两次还是两个不同的监听器?
- javascript - 从#document 中访问外部 html 内容
- php - PHP - 解析 xml 文件 - 交付的文件包含一个带有“-”的属性,当我运行 php 时会生成一个警告
- python - 匹配两个数据库中具有相似但不精确匹配的数据行的名称
- reactjs - 没有复选框的反应表选择行
- pyspark - Spark 阅读 Cassandra