可以说我有以下内容:
f :: a -> b -> c
g :: b -> c
g = f 10
Run Code Online (Sandbox Code Playgroud)
现在让我们说f实际上:
f x y = f1 x + y
Run Code Online (Sandbox Code Playgroud)
将:
g `seq` ...
Run Code Online (Sandbox Code Playgroud)
实际上是评估f1 10,所以以后运行时
g 9
Run Code Online (Sandbox Code Playgroud)
它实际上只是一个简单的添加?
如果没有,有没有办法"评估"部分应用功能的部分?
我在寻找一个通用的解决办法,不依赖于知道如何f和g工作.
不,它不会,因为一般来说,右手边的选择f可能取决于y.如果你想分享f1 x调用之间的结果g,你必须这样写f:
f x = let z = f1 x in \y -> z + y
Run Code Online (Sandbox Code Playgroud)
当然,由于懒惰,f1 x直到第一次g调用时才会评估.要进行g `seq` ...力量评估f1 x,你必须写:
f x = let z = f1 x in z `seq` (\y -> z + y)
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
我看一下Control.DeepSeq:http://hackage.haskell.org/packages/archive/deepseq/1.2.0.1/doc/html/Control-DeepSeq.html