我知道,这个问题已经被提出过了。但我还没有理解任何答案。我想我需要一个更加图解的解释。我无法理解如何用FoldRight“桥接”FoldLeft。 我不在乎Scala中的函数编程中是否存在anwer。 提前告诉你。
答案 0 :(得分:1)
只需检查一下如何实施:
def foldLeft[B](z: B)(op: (B, A) => B): B = {
var result = z
this foreach (x => result = op(result, x))
result
}
def foldRight[B](z: B)(op: (A, B) => B): B =
reversed.foldLeft(z)((x, y) => op(y, x))
foldLeft
遍历从左到右的集合,将op
应用于result
和当前元素,而foldRight
遍历反向集合(即从右到左)。
当op
是对称且传递foldLeft
和foldRight
相同时,例如:
List(1,2,3).foldLeft(0)(_ + _)
List(1,2,3).foldRight(0)(_ + _)
结果:
res0: Int = 6
res1: Int = 6
但是否则foldLeft
和foldRight
可能会产生不同的结果:
List(1,2,3).foldLeft(List[Int]()){case (list, el) => list :+ el }
List(1,2,3).foldRight(List[Int]()){case (el, list) => list :+ el }
结果:
res2: List[Int] = List(1, 2, 3)
res3: List[Int] = List(3, 2, 1)