减少大小1的列表

时间:2014-10-03 17:48:43

标签: scala reduce

scala> List(5) reduceLeft { (z, f) => z + f }
res1: Int = 5

这是如何工作的?在这种情况下执行z时,scala为z + f的值提供了什么?

2 个答案:

答案 0 :(得分:3)

像这样:

override /*TraversableLike*/
def reduceLeft[B >: A](f: (B, A) => B): B =
  if (isEmpty) throw new UnsupportedOperationException("empty.reduceLeft")
  else tail.foldLeft[B](head)(f)

正如您所看到的,reduceLeft是以foldLeft实现的,后者在空列表中是允许的,它只返回起始元素(在您的情况下为5):

override /*TraversableLike*/
def foldLeft[B](z: B)(f: (B, A) => B): B = {
  var acc = z
  var these = this
  while (!these.isEmpty) {
    acc = f(acc, these.head)
    these = these.tail
  }
  acc
}

所以基本上会返回acc

答案 1 :(得分:1)

reduceLeft将列表的第一个值作为初始值。如果没有更多元素,则返回该元素。