2014-10-03 198 views
0
scala> List(5) reduceLeft { (z, f) => z + f } 
res1: Int = 5 

這是如何工作的?在這種情況下執行z + f時,scala爲z提供了什麼值?縮小尺寸列表1

+1

[請先閱讀文檔](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

+0

@ user2864740感謝snark。我*確實*閱讀了'reduceLeft'的文檔,是嗎?它沒有具體說明在大小爲1的「List」情況下會發生什麼情況。它也沒有提及「摺疊」以供進一步研究。 「RTFM」在這裏並不是一個合適的答案。 – 2014-10-03 18:52:44

回答

2

像這樣:

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被返回。

+0

謝謝!那麼這就是'reduceLeft'的實際來源,還是僅僅是它如何實現的一個例子? – 2014-10-03 18:54:48

+1

@CoryKlein這是您可以在[LinearSeqOptimized]中找到的實際源代碼(https://github.com/scala/scala/blob/5e0880fe05fb65a8757721be7e5be6a3259c19a8/src/library/scala/collection/LinearSeqOptimized.scala),請注意,對於收集操作,與列表長度無關(如果不是空的話)。 – 2014-10-03 18:58:25

1

reduceLeft以列表的第一個值作爲初始值。如果沒有更多元素,則返回該元素。