2011-04-10 113 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