避免“分享”的好方法?

时间:2011-07-07 16:38:20

标签: haskell sharing

假设有人将这个简单的Python代码翻译成Haskell:

def important_astrological_calculation(digits):
  # Get the first 1000000 digits of Pi!
  lucky_numbers = calculate_first_digits_of_pi(1000000)
  return digits in lucky_numbers

Haskell版本:

importantAstrologicalCalculation digits =
  isInfixOf digits luckyNumbers
  where
    luckyNumbers = calculateFirstDigitsOfPi 1000000

在使用Haskell版本之后,程序员惊讶地发现他的Haskell版本“泄漏”内存 - 在第一次调用他的函数之后,luckyNumbers永远不会被释放。这令人不安,因为该程序包含一些更类似的功能,并且所有这些功能所消耗的内存都非常重要。

是否有一种简单而优雅的方式让程序“忘记”luckyNumbers

1 个答案:

答案 0 :(得分:21)

在这种情况下,您的pidigits列表是一个常量(或“常量应用形式” ),GHC可能会将其浮出来,计算一次,并在使用中分享。如果没有对CAF的引用,它将被垃圾收集。

现在,通常,如果您想要重新计算某些内容,请将其转换为函数(例如,通过添加虚拟()参数)。关于CAF的链接问题中的示例:How to make a CAF not a CAF in Haskell?