Functional programming 向左折叠,向右折叠

Functional programming 向左折叠,向右折叠,functional-programming,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 } 两者产生相同

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

两者产生相同的结果。为什么以及何时选择其中一个?foldleft和foldright在函数嵌套方式上有所不同

foldleft: (((...) + a) + a) + a
foldright: a + (a + (a + (...)))
由于您正在使用的函数是加法,因此两者给出相同的结果。尝试使用减法


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

现在尝试进行减法或除法运算,看看是否仍然得到相同的答案。。。