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

时间:2011-04-10 09:43:12

标签: haskell lazy-evaluation

Haskell Performance Resource wiki-section中,没有进一步解释的建议被提供给

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

为什么这是一件好事?究竟什么时候... - 表达式(Whnf-)被迫?

鉴于“左派身份”monad-law和定义

f $! x = x `seq` f x

我可以重写(在do - 表示法中):

do x' <- return $! x
   f x'

do x' <- x `seq` return x
   f x'

但似乎我无法进入

do f $! x

PS:如果BangPatterns - 扩展名可用,则

do !x' <- return x
   f x'

在语义上与上面给出的第一个do - 表达式相同?

2 个答案:

答案 0 :(得分:5)

你无法从

获得
do x' <- x `seq` return x
   f x'

f $! x

这是因为它们不一样。只需扩展备注:

(x `seq` return x) >>= (\ x' -> f x')

seq仅在第一个参数中(>>=)严格时才会被评估。这不一定是真的。

答案 1 :(得分:1)

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

  

强制将其参数评估为   弱头正常形式的时候   生成的IO动作被执行。它   可用于订购评估   尊重其他IO操作;它的   

给出了语义
evaluate :: a -> IO a
evaluate x = (return $! x) >>= return