【问题标题】:FoldLeft via FoldRight in Scala againFoldLeft 再次在 Scala 中通过 FoldRight
【发布时间】:2016-05-16 18:35:37
【问题描述】:

我知道,这个问题已经被问过了。但我没有理解任何答案。我想我需要一个更形象的解释。我不明白如何将 FoldLeft 与 FoldRight “桥接”。 我不在乎答案是否不在 Scala 的函数式编程中。 非常感谢您。

【问题讨论】:

  • 哪些答案你不明白?您对 foldLeft 和 foldRight 了解什么? “桥”是什么意思?
  • 不仅已经被问及回答了,今天早上也被问到了,而且那个问题似乎已经被删除了。奇怪的。无论如何,您需要解释其他人对您的不足之处,否则这将很快作为重复而关闭。您是提出并删除其他问题的同一用户,或者某些课程已将此设置为作业。在后一种情况下,您确实应该尝试一些东西,并在遇到困难时发布
  • @pedrofurla,如果它像另一个问题一样,它是关于在 foldRight 方面实现 foldLeft(反之亦然)

标签: scala functional-programming fold


【解决方案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)

【讨论】:

  • 我想说的是,我什至不明白“在右折叠方面向左折叠”是什么意思。我知道它们是如何工作的,但我不明白 foldleftviafoldright 是否意味着将一个封装在另一个内部,或者是否意味着我使用从左到右操作但使用右折叠。
  • 此外,我不知道该怎么做,我知道怎么做,但我不太了解。对不起我的表达方式,我不是说英语的人,也不是 FP 程序员。
猜你喜欢
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 2017-11-04
  • 1970-01-01
  • 2012-03-25
  • 1970-01-01
  • 2017-03-25
  • 2011-09-09
相关资源
最近更新 更多