f x y z = [n | n <- z, n > x + y]
f 1 2 [3,4]
会
x + y
一开始只执行一次,以便后续的调用被 value 3
替换。反而?是 GHC
Haskell 为 FP 优化了这项工作给我们带来了引用透明的优点吗?如何追溯证明?
最佳答案
我不认为计算出的值会被重用。
这种事情的普遍问题是,x + y
很便宜,但是您可以在那里进行一些操作,从而产生非常大的结果,您可能不想将其保留在内存中。这是一种说“这是时间/空间权衡”的冗长方式。
因此,GHC 似乎倾向于不重用工作,以防丢失的空间无法弥补获得的时间。
确定的方法是要求 GHC 在编译代码时转储 Core。然后,您可以准确地看到将要执行的内容。 (不过要准备好它会非常冗长!)哦,确保你打开优化! (即 -O2
标志。)
如果您将函数改写为
f x y z = let s = x + y in [ n | n <- z, n > s ]
现在
s
肯定只会执行一次。 (即,每次调用 f
一次。每次调用 f
时,它仍会重新计算 s
。)顺便说一句,如果您有兴趣为整个函数保存已经计算的结果,那么您要查找的搜索词是“内存”。
关于haskell - 用确定性值替换重复的功能应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28883231/