hvr*_*hvr 11 haskell lazy-evaluation
在Haskell Performance Resource wiki-section中,未给出进一步解释的建议
return $! ...除非你绝对需要懒惰,否则使用strict returns().
为什么这是一件好事?什么时候 - ...表达式(Whnf-)被迫?
鉴于"左派身份"monad-law和定义
f $! x = x `seq` f x
Run Code Online (Sandbox Code Playgroud)
我可以重写(in do-notation`):
do x' <- return $! x
f x'
Run Code Online (Sandbox Code Playgroud)
至
do x' <- x `seq` return x
f x'
Run Code Online (Sandbox Code Playgroud)
但似乎我无法达到
do f $! x
Run Code Online (Sandbox Code Playgroud)
PS:如果BangPatterns-extension可用,是
do !x' <- return x
f x'
Run Code Online (Sandbox Code Playgroud)
语义上与do上面给出的第一个表达式相同?
有一个你无法得到的理由
do x' <- x `seq` return x
f x'
Run Code Online (Sandbox Code Playgroud)
至
f $! x
Run Code Online (Sandbox Code Playgroud)
这是因为它们不一样.只需扩展符号:
(x `seq` return x) >>= (\ x' -> f x')
Run Code Online (Sandbox Code Playgroud)
seq只有(>>=)在第一个参数中是严格的时才会评估它.这不一定是真的.
| 归档时间: |
|
| 查看次数: |
522 次 |
| 最近记录: |