2012-04-16 70 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)