向左折叠并向右折叠

时间:2014-07-14 05:07:40

标签: functional-programming

我正在尝试学习如何使用向左折叠和向右折叠。这是我第一次学习函数式编程。我无法理解何时使用左侧折叠以及何时使用右侧折叠。在我看来,很多时候这两个功能是可以互换的。例如(在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
}

两者产生相同的结果。为什么以及何时选择其中一个?

1 个答案:

答案 0 :(得分:0)

foldleft和foldright在函数嵌套方式上有所不同。

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

由于您使用的功能是添加,因此它们都会给出相同的结果。尝试使用减法。

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