【问题标题】:Reducing a List of size 1减少大小为 1 的列表
【发布时间】:2014-11-28 19:33:15
【问题描述】:
scala> List(5) reduceLeft { (z, f) => z + f }
res1: Int = 5

这是如何工作的?在这种情况下执行z + f 时,scala 为z 的值提供了什么?

【问题讨论】:

  • Read the documentation first 然后查看Fold on Wikipedia。在文档中包含“发现”的信息,并在问题仍然存在时将其用于改进。
  • @user2864740 感谢您的恶作剧。我确实阅读了reduceLeft 的文档,你呢?它具体没有说明在大小为 1 的List 的情况下会发生什么。它也没有对fold 进行任何参考以供进一步研究。 “RTFM”在这里几乎不是合适的回应。

标签: scala reduce


【解决方案1】:

像这样:

override /*TraversableLike*/
def reduceLeft[B >: A](f: (B, A) => B): B =
  if (isEmpty) throw new UnsupportedOperationException("empty.reduceLeft")
  else tail.foldLeft[B](head)(f)

如您所见,reduceLeft 是根据 foldLeft 实现的,后者允许在空列表中,它只返回起始元素(在您的情况下为 5):

override /*TraversableLike*/
def foldLeft[B](z: B)(f: (B, A) => B): B = {
  var acc = z
  var these = this
  while (!these.isEmpty) {
    acc = f(acc, these.head)
    these = these.tail
  }
  acc
}

所以基本上acc 被返回了。

【讨论】:

  • 谢谢!那是reduceLeft 的实际来源,还是只是如何实现它的一个例子?
  • @CoryKlein 这是您可以在LinearSeqOptimized 中找到的实际来源,请注意,对于收集操作,列表的长度无关紧要(如果它不为空)。
【解决方案2】:

reduceLeft 将列表的第一个值作为初始值。如果没有更多元素,则返回该元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 2017-10-07
    • 2016-02-18
    • 2018-11-03
    相关资源
    最近更新 更多