在Haskell Performance Resource维基节中,没有进一步解释的建议是考虑到“严格回报”的语义是什么?
- 使用严格的回报率(
return $! ...
),除非你绝对需要他们懒惰。
为什么这是件好事? ...
-expression(Whnf-)是否被强制?
由于 “左身份” 单子法和定义
f $! x = x `seq` f x
我可以重写(在do
-notation`):
do x' <- return $! x
f x'
到
do x' <- x `seq` return x
f x'
但看来我不能去
do f $! x
PS:如果BangPatterns
-extension是可用的,是
do !x' <- return x
f x'
语义上与第一do
-expression上面给出?
我看给定的......但是,这是什么说的'$回报的用处! ...'?这对严格的单子来说是否有意义? – hvr 2011-04-10 11:36:46
@hvr:如果monad在返回类型上是严格的,那么是的。这个构造特别有用,对于monad来说,你通常要评估monad的副作用,而不是monad本身。 – fuz 2011-04-10 11:47:31
do块中的最后一件事情是'return $! ...因为(调用)函数的返回值总是被评估。即在'... >> = \ x - > return $! ...',一旦调用了lambda表达式,它将评估'($!)'应用程序。 – augustss 2011-04-10 12:56:33