繁体   English   中英

Haskell中函数调用的优化

[英]Optimization of Function Calls in Haskell

不知道该问题到底适合谷歌搜索,所以我将其直接发布到SO:

  1. Haskell中的变量是不可变的
  2. 纯函数应为相同的参数产生相同的值

从这两点可以推断出,如果您在代码中两次调用somePureFunc somevar1 somevar2 ,则只有在第一次调用时计算该值才有意义。 结果值可以存储在某种巨型哈希表(或类似的哈希表)中,并在随后的函数调用中查找。 我有两个问题:

  1. GHC是否真的进行了这种优化?
  2. 如果是这样,那么重复计算比查找结果便宜得多的情况下会发生什么情况?

谢谢。

GHC不会自动记忆 请参阅《 GHC常见子表达式消除常见问题解答》(不完全相同,但我想原因是相同的)和该问题的答案。

如果您想自己进行记忆,请查看Data.MemoCombinators

查看记忆的另一种方法是使用惰性来利用记忆。 例如,您可以根据自身定义列表。 下面的定义是所有斐波那契数的无限列表(摘自Haskell Wiki

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

因为列表是懒惰地实现的,所以它类似于预先计算(存储)以前的值。 例如fibs !! 10 fibs !! 10将创建前十个元素,以使fibs 11更快。

保存每个函数调用结果(请参阅hash consing )是有效的,但可能会导致巨大的空间泄漏,并且通常还会使程序运行速度大大降低。 检查表中是否有东西通常要比实际计算花费更多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM