seq`可以说我有以下几点:`对部分应用功能
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
工作。
seq`可以说我有以下几点:`对部分应用功能
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
工作。
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
不,不会,因为在一般情况下,右手边为f
的选择可能依赖于y
。如果你想分享的调用g
之间f1 x
的结果,你会写f
这样的:
f x = let z = f1 x in \y -> z + y
当然,由于懒惰,这将不计算f1 x
第一次g
被称为直到。为了有f1 x
g `seq` ...
力评价,你会写:
f x = let z = f1 x in z `seq` (\y -> z + y)
我并不像我能将'deepseq'到的功能。 – Clinton 2012-04-16 08:35:52
不,它看起来只适用于考虑DeepSeq的数据结构。如上所述,不是您的问题的解决方案。 – Deestan 2012-04-16 08:54:55