Scala foldLeft实现是:
def foldLeft[B](z: B)(op: (B, A) => B): B = {
var result = z
this foreach (x => result = op(result, x))
result
}
为什么scala开发者不会使用像尾递归这样的东西(这只是一个例子):
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)
}
可以吗?为什么它不能/可以?
答案 0 :(得分:2)
“为什么不用这个不那么简单的七行代码代替这个简单的三行代码呢?”
庵。这就是原因。
(如果你问的是性能问题,那么就需要两个解决方案的基准测试,并指出非闭合版本的速度要快得多。)
答案 1 :(得分:0)
根据this的答案,Scala确实支持尾递归优化,但看起来它从一开始就不存在,并且它可能在每种情况下都不起作用,因此特定的实现可能是一个遗留物。
那就是说,Scala是多范式的,我不认为它在功能编程方面力求纯洁,所以如果他们采用最实用或最方便的方法,我不会感到惊讶。
答案 2 :(得分:0)
除了必要的解决方案更简单,它也更通用。您可能已经注意到,foldLeft
已在TraversableOnce
中实施,并且仅取决于foreach
方法。因此,通过扩展Traversable
并实现foreach
,这可能是在任何集合上实现的最简单的方法,您将获得所有这些精彩的方法。
另一方面,声明性实现对列表的结构具有反思性,并且非常具体,因为它取决于Nil
和::
。