[haskell] 请解释一下 IO 的隔离功能
本帖最后由 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
谢谢。
楼上的是大好人。
第 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的定义是“私有”的,也就是没在模块中导出。
{:3_201:}