Haskell 一个好的方法来避免;“分享”吗;?

Haskell 一个好的方法来避免;“分享”吗;?,haskell,sharing,Haskell,Sharing,假设有人将这个简单的Python代码翻译成Haskell: def重要的占星术计算(数字): #获取Pi的前1000000位数! 幸运数字=计算π的第一位数字(1000000) 返回幸运数字中的数字 Haskell版本: importantAstrologicalCalculation digits = isInfixOf digits luckyNumbers where luckyNumbers = calculateFirstDigitsOfPi 1000000 在使用

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

def重要的占星术计算(数字):
#获取Pi的前1000000位数!
幸运数字=计算π的第一位数字(1000000)
返回幸运数字中的数字
Haskell版本:

importantAstrologicalCalculation digits =
  isInfixOf digits luckyNumbers
  where
    luckyNumbers = calculateFirstDigitsOfPi 1000000
在使用Haskell版本后,程序员惊讶地发现他的Haskell版本“泄漏”了内存—在第一次调用他的函数后,
luckyNumbers
从未被释放。这是令人不安的,因为该程序包含一些更相似的函数,并且所有这些函数所消耗的内存都非常大


有没有一种简单而优雅的方法让程序“忘记”
luckyNumbers

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


现在,一般来说,如果您想重新计算某些内容,请将其转换为函数(例如,通过添加一个伪
()
参数)。CAFs上链接问题中的示例:

不优雅,但如果添加
{-#NOINLINE importantastrologicalcalcalculation},会发生什么情况
?最近有一个问题,提出的问题显然是相同的,但使用了更高级的术语。您可能想看看它:将其浮出来会改变什么吗?stackoverflow.com/questions/620806创建了一个类似的情况,但没有任何常量。。