可以说我有以下内容:
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