Escuché que foldLeft es mucho más eficiente en la mayoría de las operaciones, pero la Scala School (de Twitter) dio el siguiente ejemplo. ¿Puede alguien dar un análisis de su eficiencia y deberíamos lograr la misma operación 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)
¿Puedo aclarar su respuesta con respecto a la última declaración? No es el caso que foldRight sea generalmente 10% -40% más rápido que foldLeft, pero cuando se incluye una operación inversa, esta diferencia es de esperar. Al elegir entre un plegado a la izquierda o a la derecha, el posible alto costo del armazón de pila necesario para un doblez correcto cuenta en su contra, pero el alto costo de un revés cuenta contra el uso de un foldLeft con un reverso. Si foldLeft (sin retroceso) es una opción, parece ser la elección preferible en general. –
Nota, creo que 'fold' de List' List' simplemente dobla a la izquierda + reversa en las versiones recientes de Scala, probablemente para evitar desbordamientos de pila –