在Scala再次通过FoldRight折叠左侧

时间:2016-05-16 18:35:37

标签: scala functional-programming fold

我知道,这个问题已经被提出过了。但我还没有理解任何答案。我想我需要一个更加图解的解释。我无法理解如何用FoldRight“桥接”FoldLeft。 我不在乎Scala中的函数编程中是否存在anwer。 提前告诉你。

1 个答案:

答案 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是对称且传递foldLeftfoldRight相同时,例如:

List(1,2,3).foldLeft(0)(_ + _)
List(1,2,3).foldRight(0)(_ + _)

结果:

res0: Int = 6
res1: Int = 6

但是否则foldLeftfoldRight可能会产生不同的结果:

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)