seq`可以說我有以下幾點:`對部分應用功能
f :: a -> b -> c
g :: b -> c
g = f 10
現在讓我們說f
居然是:
f x y = f1 x + y
請問:
g `seq` ...
實際評估f1 10
,所以後來運行時
g 9
它實際上只是一個簡單的加法?
如果不是,有沒有辦法「評估」部分應用函數的部分?
我正在尋找一個通用的解決方案,不需要知道如何f
和g
工作。
seq`可以說我有以下幾點:`對部分應用功能
f :: a -> b -> c
g :: b -> c
g = f 10
現在讓我們說f
居然是:
f x y = f1 x + y
請問:
g `seq` ...
實際評估f1 10
,所以後來運行時
g 9
它實際上只是一個簡單的加法?
如果不是,有沒有辦法「評估」部分應用函數的部分?
我正在尋找一個通用的解決方案,不需要知道如何f
和g
工作。
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.DeepSeq
:http://hackage.haskell.org/packages/archive/deepseq/1.2.0.1/doc/html/Control-DeepSeq.html
不,不會,因爲在一般情況下,右手邊爲f
的選擇可能依賴於y
。如果你想分享的調用g
之間f1 x
的結果,你會寫f
這樣的:
f x = let z = f1 x in \y -> z + y
當然,由於懶惰,這將不計算f1 x
第一次g
被稱爲直到。爲了有f1 x
g `seq` ...
力評價,你會寫:
f x = let z = f1 x in z `seq` (\y -> z + y)
我並不像我能將'deepseq'到的功能。 – Clinton 2012-04-16 08:35:52
不,它看起來只適用於考慮DeepSeq的數據結構。如上所述,不是您的問題的解決方案。 – Deestan 2012-04-16 08:54:55