假设我有以下内容:
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
的工作方式。
答案 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.DeepSeq
:http://hackage.haskell.org/packages/archive/deepseq/1.2.0.1/doc/html/Control-DeepSeq.html