首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么Haskell不能通过严格的评估来执行IO操作?

为什么Haskell不能通过严格的评估来执行IO操作?
EN

Stack Overflow用户
提问于 2014-07-16 16:12:39
回答 2查看 1.9K关注 0票数 17

我只是在学习Haskell和IO monad。我想知道为什么这不会强制程序输出"hi“和”再见“:

代码语言:javascript
复制
second a b = b
main = print ((second $! ((print "hi") >>= (\r -> return ()))) "bye")

据我所知,$!操作符将强制计算second的第一个参数,而>>=操作符需要运行print "hi"才能从中获取值并将其传递给\r -> return (),后者将在屏幕上显示"hi“。

我的推理有什么问题?

此外,有没有办法防止Haskell不会被欺骗(除了使用不安全的函数)在“安全”代码中运行IO操作?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-16 16:25:41

您强制使用的表达式是IO ()类型的((print "hi") >>= (\r -> return ()))。因此,它表示IO操作。但是评估这样的东西和运行它是完全不同的!

评估一个值意味着执行足够的步骤将其转换为所谓的weak head normal form。因为IO是抽象的,所以要理解它在本例中的含义有点棘手,但可以将IO a想象成RealWorld -> (a, RealWorld),然后弱头部范式是一个等待RealWorld的函数。

运行意味着计算,但也会将RealWorld作为参数传递,从而导致IO效应的发生。

所有这些都不是IO所特有的;您的困惑和概念同样适用于a -> b。如果您理解了当第二个参数是函数时$!做了什么,那么就会理解当它是一个IO操作时会发生什么。

票数 34
EN

Stack Overflow用户

发布于 2014-07-16 16:26:29

你混淆了评估和执行。当您强制使用像print "hi"这样的表达式时,不会输出任何内容。它只生成一个值(在本例中,是一个IO()类型的值),表示打印输出的操作。您可以将print "hi"的值看作是打印"hi“的秘诀。

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

https://stackoverflow.com/questions/24775528

复制
相关文章

相似问题

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