scala> List(5) reduceLeft { (z, f) => z + f }
res1: Int = 5
这是如何工作的?在这种情况下执行z + f
时,scala为z
提供了什么值?缩小尺寸列表1
scala> List(5) reduceLeft { (z, f) => z + f }
res1: Int = 5
这是如何工作的?在这种情况下执行z + f
时,scala为z
提供了什么值?缩小尺寸列表1
像这样:
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
被返回。
谢谢!那么这就是'reduceLeft'的实际来源,还是仅仅是它如何实现的一个例子? – 2014-10-03 18:54:48
@CoryKlein这是您可以在[LinearSeqOptimized]中找到的实际源代码(https://github.com/scala/scala/blob/5e0880fe05fb65a8757721be7e5be6a3259c19a8/src/library/scala/collection/LinearSeqOptimized.scala),请注意,对于收集操作,与列表长度无关(如果不是空的话)。 – 2014-10-03 18:58:25
reduceLeft
以列表的第一个值作为初始值。如果没有更多元素,则返回该元素。
[请先阅读文档](http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.List),然后参见[Wiki on Wikipedia](http:/ /en.wikipedia.org/wiki/Fold_(higher-order_function))。如果问题依然存在,请在文件中包含“发现”的信息并用于改进。 – user2864740 2014-10-03 17:51:31
@ user2864740感谢snark。我*确实*阅读了'reduceLeft'的文档,是吗?它没有具体说明在大小为1的“List”情况下会发生什么情况。它也没有提及“折叠”以供进一步研究。 “RTFM”在这里并不是一个合适的答案。 – 2014-10-03 18:52:44