[haskell] 请解释一下 IO 的隔离功能

发布于 2022-09-02 05:35:51 字数 592 浏览 25 评论 3

本帖最后由 retuor 于 2010-03-01 09:35 编辑

大概知道一些,但还比较模糊。以下是我从各种资料中了解到的:

  • IO action 也是值,可以象其它值一样用---传递给函数,let 绑定;
  • IO action 只在 main 中执行
  • no escape

迷惑的地方:

第 1 点  action 指的是什么?IO String 是 action 吗?我觉得应该不是,它应该是某种 action 产生的值吧?
第 2 点  是不是所有代码都在 main 中执行了,包括求值?那就不仅仅是 IO action 了。
第 3 点  尝试了写个函数从 IO String 中提取 String,还真的做不到。其它 monad,象 Maybe, [] 是可以的,但我没找到 IO Sting 的构造函数,没法用模式匹配的方式把它提取出来。(这个如果写出来,就不是函数了,因为返回值不确定。尝试去写是想从不同角度认识这个问题 )

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

噩梦成真你也成魔 2022-09-04 16:48:46

谢谢。

楼上的是大好人。

心如狂蝶 2022-09-04 14:18:37

第 1 点  action 指的是什么?IO String 是 action 吗?我觉得应该不是,它应该是某种 action 产生的值吧?

action好像就是一个函数,例如gets :: IO String。

第 2 点  是不是所有代码都在 main 中执行了,包括求值?那就不仅仅是 IO action 了。

好象是的...main是程序的入口吧。main也是IO action啊

第 3 点  尝试了写个函数从 IO String 中提取 String,还真的做不到。其它 monad,象 Maybe, [] 是可以的,但我没找到 IO Sting 的构造函数,没法用模式匹配的方式把它提取出来。(这个如果写出来,就不是函数了,因为返回值不确定。尝试去写是想从不同角度认识这个问题 )

呃,有个unsafePerformIO,不过好像官方不怎么推荐?haskell的纯洁性就都没啦~
不能对IO使用模式匹配是因为IO的定义是“私有”的,也就是没在模块中导出。

平生欢 2022-09-04 09:13:37

{:3_201:}

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文