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