我剛纔看了List.scala的foldRight()
的實現。List foldRight總是使用foldLeft?
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(...)
。
是List.foldRight
實現與foldLeft
爲了利用單個堆棧幀,而不是使用多個堆棧幀與foldLeft
?
從2.10開始,實現似乎已經發生了變化! 'foldRight'曾經是簡單的遞歸,比倒退和摺疊式快10% - 40%。 http://stackoverflow.com/questions/11004715/foldright-efficiency和2.10.0來源:https://github.com/scala/scala/blob/v2.10.0/src/library/scala/collection/immutable/List .scala#L1 –
爲什麼它會改變,Luigi? –
堆棧溢出錯誤。我認爲馬丁一直在追求審美和性能方面的原因。 –