【问题标题】:Scala will stack overflow in tail recursion without trampolines, which language manages this? [closed]Scala 将在没有蹦床的情况下在尾递归中堆栈溢出,哪种语言可以管理这个? [关闭]
【发布时间】:2014-08-07 13:52:29
【问题描述】:

我正在学习使用 Scala 进行函数式编程,偶然发现了 Runar Bjarnason http://youtu.be/hzf3hTUKk8U?t=17m35s 的精彩演讲

是否有语言已经解决了这个问题:

  • 尾递归消除(不使用蹦床或其他 显式构造) 我知道 Scala 可以将 self call tail recursion 转换为循环,从而避免创建堆栈,但是 scala 编译器不接受 @annotation.tailrec 的递归,如 3min - 7m 的剪辑所示。

这里寻求的语言是函数式的,具有编译时类型系统,并且具有惰性求值。

回答上述问题后,我检查已回答的问题。但是很高兴知道 Bjarnason 提供的其他语言功能是否也已经由某种语言管理: - 实物参考 - 更好的类型推断 - 未装箱的函数参考

【问题讨论】:

  • Haskell 浮现在脑海中。
  • Scala 确实迭代地处理直接尾递归。但它不进行任何其他类型的尾调用优化,因此相互尾递归函数会累积激活记录。
  • 它并不是真正基于意见的(除了“更好”)。这是一个客观的问题(是否存在具有这些技术特征的语言)。
  • @Paul 好吧,然后它会用more precise reason关闭
  • 也许吧。我仍然认为这不是一个不合理的问题。不过,不确定是否应该问这个问题

标签: scala recursion functional-programming stack-overflow


【解决方案1】:

Scheme 语言(lisp 系列的一部分)由语言规范保证执行尾调用优化。但是它没有您提到的任何不错的语言功能。

对于具有强大优化编译器(执行 TCO 等等)以及您所要求的所有强大语言功能的现代函数式语言,我强烈推荐 Haskell

【讨论】:

  • 现在我第二次看了这个演讲,我猜 Runar 的意思是向 Scalaists 展示 Haskell 有这 5 个特性,这些特性在 Scala 中也很不错。对于我作为 FB 的新手来说,避免蹦床似乎是一种语言提供的易于管理的功能。
猜你喜欢
  • 2018-11-02
  • 2020-10-03
  • 2015-11-30
  • 2016-03-24
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 2011-07-17
相关资源
最近更新 更多