可以说我有以下内容:
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。
不,它不会,因为一般来说,右手边的选择f可能取决于y. 如果您想在对 的f1 x调用之间共享结果,g则必须这样编写f:
f x = let z = f1 x in \y -> z + y
当然,由于懒惰,f1 x直到第一次g调用时才会评估。要对 进行g `seq` ...强制评估f1 x,您必须编写:
f x = let z = f1 x in z `seq` (\y -> z + y)
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