haskell - 避免 "sharing"的好方法?

标签 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

最佳答案

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

现在,一般来说,如果您想要重新计算某些内容,请将其转换为函数(例如,通过添加虚拟 () 参数)并启用 -fno-full-laziness。有关 CAF 的链接问题中的示例:How to make a CAF not a CAF in Haskell?

关于haskell - 避免 "sharing"的好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6614023/

相关文章:

haskell - INLINE Pragma 与类型类相结合

ios - 编译一个包含 sharekit 的项目

android - 如何阻止我的应用程序通过蓝牙共享?

javascript - 是否可以添加一个链接来下载只能通过在 Facebook 上共享来下载的文件?

android - 如何将应用程序文件夹共享给另一个保管箱用户

python - 不同编程语言中的 float 学

scala - Haskell 中的哪些功能无法用 Scala 模拟?

haskell - 是否存在看起来不像容器的重要可折叠或可遍历实例?

windows - 在 Haskell 中,如何在 Windows 上安装编码包?

php - 用于照片共享社交应用程序(如 Instagram)的 Mysql 查询字符串