5

可以说我有以下内容:

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

4

2 回答 2

9

不,它不会,因为一般来说,右手边的选择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)
于 2012-04-16T08:18:58.260 回答
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

于 2012-04-16T08:15:49.127 回答