【发布时间】:2013-10-23 17:05:22
【问题描述】:
我刚刚看了List.scala对foldRight()的实现。
override def reverse: List[A] = {
var result: List[A] = Nil
var these = this
while (!these.isEmpty) {
result = these.head :: result
these = these.tail
}
result
}
override def foldRight[B](z: B)(op: (A, B) => B): B =
reverse.foldLeft(z)((right, left) => op(left, right))
据我了解,在List 上调用foldRight 会导致调用theList.reverse.foldLeft(...)。
是否使用foldLeft 实现List.foldRight 以便利用单个堆栈帧而不是使用多个带有foldLeft 的堆栈帧?
【问题讨论】:
-
自 2.10 以来,实施似乎在某些时候发生了变化!
foldRight曾经是简单的递归,比反转和左折叠快 10% - 40%。 stackoverflow.com/questions/11004715/foldright-efficiency 和 2.10.0 来源:github.com/scala/scala/blob/v2.10.0/src/library/scala/… -
为什么会改变,路易吉?
-
堆栈溢出错误。我认为 Martin 一直坚持下去是出于审美和性能方面的原因。
标签: scala