列出Scala中foldLeft的实现

时间:2015-07-12 21:24:56

标签: 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开发者不会使用像尾递归这样的东西(这只是一个例子):

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)
}

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

3 个答案:

答案 0 :(得分:2)

“为什么不用这个不那么简单的七行代码代替这个简单的三行代码呢?”

庵。这就是原因。

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

答案 1 :(得分:0)

根据this的答案,Scala确实支持尾递归优化,但看起来它从一开始就不存在,并且它可能在每种情况下都不起作用,因此特定的实现可能是一个遗留物。

那就是说,Scala是多范式的,我不认为它在功能编程方面力求纯洁,所以如果他们采用最实用或最方便的方法,我不会感到惊讶。

答案 2 :(得分:0)

除了必要的解决方案更简单,它也更通用。您可能已经注意到,foldLeft已在TraversableOnce中实施,并且仅取决于foreach方法。因此,通过扩展Traversable并实现foreach,这可能是在任何集合上实现的最简单的方法,您将获得所有这些精彩的方法。

另一方面,声明性实现对列表的结构具有反思性,并且非常具体,因为它取决于Nil::