2011-04-10 107 views
11

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上面给出?

回答

5

有你不能从

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

f $! x 

这是因为他们是不一样的理由。只需展开做记号:

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

如果(>>=)是在其第一个参数严格的seq将只进行评估。这不一定是真的。

+0

我看给定的......但是,这是什么说的'$回报的用处! ...'?这对严格的单子来说是否有意义? – hvr 2011-04-10 11:36:46

+0

@hvr:如果monad在返回类型上是严格的,那么是的。这个构造特别有用,对于monad来说,你通常要评估monad的副作用,而不是monad本身。 – fuz 2011-04-10 11:47:31

+0

do块中的最后一件事情是'return $! ...因为(调用)函数的返回值总是被评估。即在'... >> = \ x - > return $! ...',一旦调用了lambda表达式,它将评估'($!)'应用程序。 – augustss 2011-04-10 12:56:33

1

对于IO这里也是有用Control.Exception.evaluate

强制其参数执行 所得IO动作时进行评估,以 弱头正常形式。它可以用于对 进行与其他IO操作有关的评估;其 语义由

evaluate :: a -> IO a 
evaluate x = (return $! x) >>= return