scala> List(5) reduceLeft { (z, f) => z + f }
res1: Int = 5
这是如何工作的?在这种情况下执行z
时,scala为z + f
的值提供了什么?
答案 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
将列表的第一个值作为初始值。如果没有更多元素,则返回该元素。