首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >评估和执行IO操作的区别:是什么原因导致Haskell执行IO?

评估和执行IO操作的区别:是什么原因导致Haskell执行IO?
EN

Stack Overflow用户
提问于 2017-03-07 20:18:47
回答 2查看 1.1K关注 0票数 6

Haskell实际上使用什么机制来决定调用下面的4个操作?

代码语言:javascript
复制
main :: IO ()
main = getLine >>= putStrLn >> getLine >>= putStrLn

一开始我以为这和懒惰的评价有关,但是.从真正的单词Haskell,关于IO行动,他们

在执行时产生效果,但在评估时不产生效果

因此,我怀疑这是某种其他机制,而不是希望“评估”main的系统。这个机制是什么?或者,如果是评估,Haskell“想要”什么才能使它执行操作链?

EN

回答 2

Stack Overflow用户

发布于 2017-03-07 20:43:57

作为一阶近似,Haskell程序中唯一的计算源是main。这意味着:

  • IO操作可以通过>>=>><*>fmap等进行组装和组合,以生成除
  • 只有main IO操作才能产生效果。

从某种意义上说,Haskell程序所做的一切都是运行main :: IO ()。要对任何要评估的内容进行评估,都必须阻止运行IO操作(这正是懒惰的地方)。这就引出了一个问题:实际运行IO操作意味着什么?

在这种情况下,IO的行为就像一个(严格的) State monad,它通过它执行一个RealWorld状态(它不包含任何信息--它是副作用在世界上包含的状态的象征),所以“运行”IO (相当于State RealWorld)就像调用runState。当然,这个runState只能在任何程序中出现一次--而这正是main所做的(以及它的神奇之处)!

票数 12
EN

Stack Overflow用户

发布于 2017-03-07 20:42:09

根据baby的说法,有一种代表真实世界的“假”类型,RealWorld,而IO (a)实际上是一个函数。

代码语言:javascript
复制
type IO a  =  RealWorld -> (a, RealWorld)

因此,正如您在其他语言中可能预期的那样,main实际上是一个函数。

代码语言:javascript
复制
main :: RealWorld -> ((), RealWorld)

这在程序运行时被调用。因此,要计算最终输出(类型为((), RealWorld) ),Haskell需要获得RealWorld组件的值,为此,它必须运行main函数。注意:是运行时导致这个函数运行。在Haskell中,无法触发此函数的执行。

在以下情况下

代码语言:javascript
复制
main = getLine >>= putStrLn >> getLine >>= putStrLn

每个操作实际上都是函数,为了在最终的RealWorld结束时计算出putStrLn值输出,它需要运行它,以及导致它的所有操作。

因此,它是懒惰的评估,但隐藏的RealWorld值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42657529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档