2014-10-03 168 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以列表的第一个值作为初始值。如果没有更多元素,则返回该元素。