2012-04-16 75 views
5

seq`可以說我有以下幾點:`對部分應用功能

f :: a -> b -> c 
g :: b -> c 
g = f 10 

現在讓我們說f居然是:

f x y = f1 x + y 

請問:

g `seq` ... 

實際評估f1 10 ,所以後來運行時

g 9 

它實際上只是一個簡單的加法?

如果不是,有沒有辦法「評估」部分應用函數的部分?

我正在尋找一個通用的解決方案,不需要知道如何fg工作。

回答

3

seq淺:

Prelude> let f1 = undefined 
Prelude> let f = \x -> \y -> f1 x + y 
Prelude> let g = f 10 
Prelude> g `seq` 1 
1 
Prelude> g 9 
*** Exception: Prelude.undefined 
Prelude> 

我看看Control.DeepSeqhttp://hackage.haskell.org/packages/archive/deepseq/1.2.0.1/doc/html/Control-DeepSeq.html

+0

我並不像我能將'deepseq'到的功能。 – Clinton 2012-04-16 08:35:52

+0

不,它看起來只適用於考慮DeepSeq的數據結構。如上所述,不是您的問題的解決方案。 – Deestan 2012-04-16 08:54:55

9

不,不會,因爲在一般情況下,右手邊爲f的選擇可能依賴於y。如果你想分享的調用g之間f1 x的結果,你會寫f這樣的:

f x = let z = f1 x in \y -> z + y 

當然,由於懶惰,這將不計算f1 x第一次g被稱爲直到。爲了有f1 xg `seq` ...力評價,你會寫:

f x = let z = f1 x in z `seq` (\y -> z + y)