在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
- 表达式相同?
答案 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