Ho sentito che foldLeft è molto più efficiente nella maggior parte delle operazioni, ma Scala School (da Twitter) ha fornito il seguente esempio. Qualcuno può dare un'analisi della sua efficienza e dovremmo ottenere la stessa operazione usando foldLeft?foldRight Efficiency?
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)
Posso chiarire la risposta relativa all'ultima affermazione? Non è il caso che foldRight è generalmente più veloce del 10% -40% rispetto a foldLeft, ma quando viene inclusa un'operazione inversa, questa differenza è normale. Quando si sceglie tra una piega a sinistra o una a destra, il costo possibilmente alto del telaio dello stack necessario per una piega a destra conta contro di esso, ma l'alto costo di un inversione conta contro l'uso di un foldLeft con un rovescio. Se foldLeft (senza reverse) è un'opzione, sembra essere la scelta preferibile in generale. –
Nota, credo che 'List''s' foldRight' faccia left fold + reverse nelle versioni recenti di Scala, probabilmente per evitare overflow dello stack –