【问题标题】:Functional languages & support for memoization功能语言和对记忆的支持
【发布时间】:2011-01-24 10:16:04
【问题描述】:

当前流行的函数式语言中是否有任何一种对记忆化有很好的支持?如果我要根据它的记忆力来选择一种,你会推荐哪一种?为什么?

更新:我正在寻找优化有向图(其中节点可以是函数或数据)。当图中的节点更新时,我希望仅当其他节点的值依赖于更改的节点时才重新计算它们。

Update2:需要免费或开源语言/运行时。

【问题讨论】:

标签: functional-programming memoization


【解决方案1】:

对于 Haskell,Conal Elliott 在functional memo tries 上发布了一篇漂亮的博客文章。这项工作非常聪明而且相当有深度,Conal 后来将其扩展到polymorphic functions。无论您使用哪种语言,都强烈推荐使用此内容,因为它揭示了函数式语言中的深层思想

但是,查看您的更新,尚不清楚 memoization 是否真的是您想要的。您的扩展问题陈述(通过有向图传播更新)几乎是增量计算的教科书示例,Bob Harper 和Umut Acar 在这方面做了很多工作。我相信他们有一个用标准 ML 编写的免费库。在self-adjusting computation 上查看 Umut 的页面。

【讨论】:

  • @Norman - 感谢您提供有趣的链接并同意,在进行更新时,在考虑了更多之后,我意识到 memoization 可能不是解决方案......但我仍然很想知道记忆化支持的深度。
  • 按照上面包含的自我调整计算的链接,得到ttic.uchicago.edu/~umut/papers/toplas06.html,这看起来正是我想要的——“自适应函数语言”......“按值调用函数用自适应原语扩展的语言。” ....“随着自适应程序的执行,底层系统以动态依赖图的形式表示执行中的数据和控制依赖关系。当程序的输入发生变化时,变化传播算法会更新输出和动态通过传播变化的依赖图”
  • 对于多态记忆的更优雅的方法(使用深度和优雅的属性而不是操作魔法),请参阅帖子 Memoizing polymorphic functions via unmemoization,其中主要包含我对 Dan 的反思Piponi 的帖子 Memoizing Polymorphic Functions with High School Algebra and Quantifiers.
【解决方案2】:

在 Haskell 上,请参阅 this 了解一下。

对于 Lisp,this 是来自 Google 的第一个看起来相关的点击。

对于 F#,this 可能是一个不错的起点。

现在我已经为你完成了谷歌搜索。这个good支持吗?你决定:-)

哦,我会推荐 Mathematica,但我知道很多人都被它的价格标签吓到了。严格来说,它可能更像是一个术语重写系统,而不是一个函数式编程系统,而且它在任何意义上都不是纯粹的。但它确实做记忆。

编辑:我忘记了 Erlang,它目前有很大的吸引力——我不知道怎么做,但我希望它可以做 memoization。

【讨论】:

    【解决方案3】:

    是的,你根本不需要记忆,你想要精确的依赖跟踪。 您可以使用 Haskell 函数图库 (fgl) 创建您的有向图,然后使用后继函数来准确了解要更新的节点: http://hackage.haskell.org/cgi-bin/hackage-scripts/package/fgl

    本文将极大地帮助您理解文档: http://web.engr.oregonstate.edu/~erwig/fgl/

    后继函数名为 suc,在模块 Data.Graph.Inductive.Graph 中

    往不同的方向发展,支持此功能的一种流行的函数式语言是 Excel。 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-28
      • 2016-09-28
      • 1970-01-01
      • 2020-07-07
      • 2013-08-14
      • 1970-01-01
      • 2017-01-14
      • 1970-01-01
      相关资源
      最近更新 更多