haskell - 用确定性值替换重复的功能应用程序

标签 haskell

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/

相关文章:

haskell - 如何证明一个函数对于其类型来说是唯一的?

haskell - 递归中的部分应用函数

haskell - 如何使用功能语言实现语言?

Haskell 快照 : Session example

haskell - 合并具有独特元素的列表

haskell - 如何定义一个无法推导类型的 Haskell 类型类?

haskell - Haskell 中的斐波那契封闭式表达式

linux - Cabal 无法在 Linux 上安装 network-2.6.3.1

haskell - vim-haskellmode 和 hsenv

scala - 依赖方法类型有哪些引人注目的用例?