2014-01-31 73 views

回答

6

它应该显示聚合的方向。 FoldLeft汇总来自左到右,所以你可以想像蓄电池B中左侧聚成一团的东西,因为它接近各个答:

如果你有这样的:

Vector(1,2,3,4,5).foldLeft(0)((b,a) => b + a) 

然后你得到这个行为

B ...As... 
--------------- 
(0), 1, 2, 3, 4, 5 
(0+1), 2, 3, 4, 5 
(0+1+2), 3, 4, 5 
(0+1+2+3), 4, 5 
(0+1+2+3+4),  5 
(0+1+2+3+4+5) 

另一方面,FoldRight汇总了右侧的内容。所以,如果你有这样的:

Vector(1,2,3,4,5).foldRight(0)((a,b) => a + b) 

然后,你这种行为

...As...  B 
----------------- 
1, 2, 3, 4, 5 (0) 
1, 2, 3, 4, (5+0) 
1, 2, 3, (4+5+0) 
1, 2, (3+4+5+0) 
1, (2+3+4+5+0) 
    (1+2+3+4+5+0) 
0

@dhg已经提供了一个很好的答案。我的例子说明了一个有趣的微妙之处:即,有时最初的 值传递给给定函数的顺序很重要。所以我想我会发布这个关于 有兴趣的案例,其中foldRight的行为可能不同于foldLeft ,具有相同的初始值,相同的功能和相同的输入列表。

考虑下面的幂:

def verbosePower(base:Double, exp:Double) = { 
     println(s"base=$base/exp=$exp") ; 
     math.pow(base, exp) 
    } 
    var X = List(2.0,3).foldLeft(1.0) (verbosePower) 
    System.out.println("x:" + X); 

    X = List(2.0,3).foldRight(1.0) (verbosePower) 
    System.out.println("x:" + X); 

的输出和来自foldLeft结果是:

base=1.0/exp=2.0 
base=1.0/exp=3.0 
X: Double = 1.0 

的输出和来自foldRight的结果是:

base=3.0/exp=1.0 
base=2.0/exp=3.0 
X: Double = 8.0 
总之
+1

,这个属性称为“交换性”,因此对于不可交换的'pow','foldLeft'和'fol​​dRight'是不同的。并且调用并行集合的'reduce(verbosePower)'也不会产生稳定的结果。 – dk14

+0

@ dk14关于发生了什么事情的很好的数学总结。 –