Scala中foldLeft的列表实现

Scala中foldLeft的列表实现,scala,Scala,Scala foldLeft的实现是: def foldLeft[B](z: B)(op: (B, A) => B): B = { var result = z this foreach (x => result = op(result, x)) result } 为什么scala开发人员不使用尾部递归或类似的东西(这只是一个示例): 会吗?为什么它不能/可以?根据答案,Scala确实支持尾部递归优化,但它似乎从一开始就不支持,而且它可能仍然不能在所有情况下工作,

Scala foldLeft的实现是:

def foldLeft[B](z: B)(op: (B, A) => B): B = {
   var result = z
   this foreach (x => result = op(result, x))
   result
}
为什么scala开发人员不使用尾部递归或类似的东西(这只是一个示例):

会吗?为什么它不能/可以?

根据答案,Scala确实支持尾部递归优化,但它似乎从一开始就不支持,而且它可能仍然不能在所有情况下工作,因此特定的实现可能是一个遗留问题

也就是说,Scala是一种多范式,我认为它在函数式编程方面并不追求纯粹性,因此如果他们选择最实用或最方便的方法,我也不会感到惊讶。

“为什么不将这段简单的三行代码替换为这段不太简单的七行代码呢?”

嗯。这就是为什么


(如果您询问的是性能,那么您需要两种解决方案的基准测试,并指出非闭包版本的速度要快得多。)

除了命令式解决方案更简单之外,它还更通用。您可能已经注意到,
foldLeft
是在
TraversableOnce
中实现的,并且只依赖于
foreach
方法。因此,通过扩展
Traversable
并实现
foreach
,这可能是在任何集合上实现的最简单方法,您可以获得所有这些奇妙的方法

另一方面,声明性实现在列表的结构上是自反的,并且非常具体,因为它依赖于
Nil

我不确定所有这些“为什么这个Scala库是这样写的?”问题都非常有用,即使所讨论的库是标准库。他们可能更适合Scala邮件列表或Scala/Scala Gitter聊天室。
def foldLeft[T](start: T, myList: List[T])(f:(T, T) => T): T = {
  def foldRec(accum: T, list: List[T]): T = {
    list match {
      case Nil => accum
      case head :: tail => foldRec(f(accum, head), tail)
    }
  }
  foldRec(start, myList)
}