在Scala中实现foldLeft

时间:2014-06-15 17:28:26

标签: scala collections fold

TraversableOnce使用mutable foldLeft实现var result

def foldLeft[B](z: B)(op: (B, A) => B): B = {
   var result = z
   this foreach (x => result = op(result, x))
   result
}

我理解递归实现foldLeft是不切实际的。现在我想知道是否有可能在没有可变变量的情况下有效地实现foldLeft

可以吗?为什么不能呢?

2 个答案:

答案 0 :(得分:7)

尾递归是你的朋友:

def foldLeft[A, B](xs: Seq[A], z: B)(op: (B, A) => B): B = {
  def f(xs: Seq[A], acc: B): B = xs match {
    case Seq()   => acc
    case x +: xs => f(xs, op(acc, x))
  }
  f(xs, z)
}

顺便说一下,TraversableOnce没有实现headtail,访问元素的唯一方法是使用foreach

答案 1 :(得分:0)

def foldLeft[B](z: B)(op: (B, A) => B): B = {
  val thislist = this.toList
  @tailrec
  def myFold(result: B, list: List[A]): B = list match {
    case Nil => result
    case head :: tail => myFold(op(result,head), tail)
  }
  myFold(z, thislist)
}
相关问题