我聽說foldLeft在大多數操作中效率更高,但斯卡拉學校(來自Twitter)給出了下面的例子。有人可以分析其效率,並且我們是否應該使用foldLeft來實現相同的操作?foldRight效率?
val numbers = List(1,2,3,4,5,...10)
def ourMap(numbers: List[Int], fn: Int => Int): List[Int] = {
numbers.foldRight(List[Int]()) { (x: Int, xs: List[Int]) =>
fn(x) :: xs
}
}
scala> ourMap(numbers, timesTwo(_))
res0: List[Int] = List(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)
我可以澄清你對上次陳述的回答嗎? foldRight通常比foldLeft快10%-40%,但是如果包含反向操作,那麼這種差異是可以預料的。在左右摺疊之間進行選擇時,正確摺疊所需的堆疊框架的成本可能很高,但反向摺疊的高成本會反向使用foldLeft。如果foldLeft(沒有反向)是一個選項,它似乎是整體的首選。 –
請注意,我相信'List'的'foldRight'只是在最近版本的Scala中左對齊+反轉,可能是爲了避免堆棧溢出 –