2014-07-14 135 views
1

我正在尝试学习如何使用折叠向左并向右折叠。这是我第一次学习函数式编程。我无法理解什么时候使用折叠,何时使用折叠。在我看来,很多时候这两种功能是可以互换的。例如(在Scala中)这两个函数:向左折叠并向右折叠

val nums = List(1, 2, 3, 4, 5) 

val sum1 = nums.foldLeft(0) { (total, n) => 
    total + n 
} 
val sum2 = nums.foldRight(0) {(total, n) => 
    total + n 
} 

两者都产生相同的结果。为什么和什么时候我会选择一个或另一个?

+0

现在尝试减去或做除法,看看你是否仍然得到相同的答案... – alfasin

回答

0

foldleft和foldright的功能嵌套方式不同。

foldleft: (((...) + a) + a) + a 
foldright: a + (a + (a + (...))) 

由于您使用的函数是加法,它们都给出了相同的结果。尝试使用减法。

此外,使用折叠(左/右)的动机不是结果 - 在大多数情况下,两者都产生相同的结果。这取决于你希望你的功能被聚合到哪个位置。