17

不知道这个问题到底要谷歌什么,所以我将它直接发布到 SO:

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

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

  1. GHC真的会做这种优化吗?
  2. 如果是这样,在重复计算实际上比查找结果更便宜的情况下,行为是什么?

谢谢。

4

2 回答 2

17

GHC 不做自动记忆。请参阅 GHC 关于通用子表达式消除的常见问题解答(不完全相同,但我的猜测是推理是相同的)和这个问题的答案。

如果你想自己做记忆,那么看看Data.MemoCombinators

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

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

因为列表是延迟实现的,所以它类似于预先计算(记忆)以前的值。egfibs !! 10将创建前十个元素,这样fibs 11会更快。

于 2011-05-22T08:59:12.667 回答
6

保存每个函数调用结果(参见hash consing)是有效的,但可能会造成巨大的空间泄漏,并且通常还会大大减慢您的程序速度。检查表中是否有某些内容通常比实际计算要花费更多。

于 2011-05-22T13:02:46.963 回答