部分应用函数的`seq`

时间:2012-04-16 07:51:13

标签: haskell 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的工作方式。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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