Scala中foldLeft的列表实现
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确实支持尾部递归优化,但它似乎从一开始就不支持,而且它可能仍然不能在所有情况下工作,
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)
}