部分应用函数的`seq`

Cli*_*ton 5 haskell seq

可以说我有以下内容:

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)

它实际上只是一个简单的添加?

如果没有,有没有办法"评估"部分应用功能的部分?

我在寻找一个通用的解决办法,不依赖于知道如何fg工作.

ham*_*mar 9

不,它不会,因为一般来说,右手边的选择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)


Dee*_*tan 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>
Run Code Online (Sandbox Code Playgroud)

我看一下Control.DeepSeqhttp://hackage.haskell.org/packages/archive/deepseq/1.2.0.1/doc/html/Control-DeepSeq.html