首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“严格返回”的语义是什么?

“严格返回”的语义是什么?
EN

Stack Overflow用户
提问于 2011-04-10 09:43:11
回答 2查看 606关注 0票数 11

Haskell性能资源 wiki一节中,未作进一步解释的建议提供给

  • 使用严格的返回(return $! ...),除非你绝对需要他们懒惰。

为什么这么做是件好事?...-expression (Whnf-)究竟是什么时候被强制的?

给出了“左同一性”的单律和定义。

代码语言:javascript
复制
f $! x = x `seq` f x

我可以重写(用do-notation`):

代码语言:javascript
复制
do x' <- return $! x
   f x'

代码语言:javascript
复制
do x' <- x `seq` return x
   f x'

但我似乎不能

代码语言:javascript
复制
do f $! x

PS:如果BangPatterns-extension可用,则为

代码语言:javascript
复制
do !x' <- return x
   f x'

在语义上与上面给出的第一个do-expression相同吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-10 10:58:40

有一个你无法从

代码语言:javascript
复制
do x' <- x `seq` return x
   f x'

代码语言:javascript
复制
f $! x

这是因为他们不一样。只需展开do表示法:

代码语言:javascript
复制
(x `seq` return x) >>= (\ x' -> f x')

只有在seq的第一个参数是严格的情况下,才会对(>>=)进行评估。这不一定是真的。

票数 5
EN

Stack Overflow用户

发布于 2011-04-10 13:27:21

对于IO,还有一个有用的Control.Exception.evaluate

在执行结果IO操作时,强制将其参数求值为弱头范式。它可以用于对其他IO操作排序计算;它的语义由

代码语言:javascript
复制
evaluate :: a -> IO a
evaluate x = (return $! x) >>= return
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5610945

复制
相关文章

相似问题

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