Pocas cosas para mencionar aquí, antes de dar la respuesta real:
- Su pregunta no tiene nada que ver
left
, se trata más bien de la diferencia entre reducir y plegar
- La diferencia no es la implementación en absoluto, solo mira las firmas.
- La pregunta no tiene nada que ver con Scala en particular, sino con los dos conceptos de programación funcional.
De vuelta a su pregunta:
Aquí está la firma de foldLeft
(también podría haber sido foldRight
para el punto que voy a hacer):
def foldLeft [B] (z: B)(f: (B, A) => B): B
Y aquí está la firma de reduceLeft
(de nuevo, la dirección no importa aquí)
def reduceLeft [B >: A] (f: (B, A) => B): B
Estos dos se ven muy similares y por lo tanto causaron la confusión. reduceLeft
es un caso especial de foldLeft
(que por cierto significa que a veces puedes expresar lo mismo usando cualquiera de ellos).
Cuando llame a reduceLeft
say en un List[Int]
, literalmente reducirá toda la lista de enteros en un solo valor, que será de tipo Int
(o un supertipo de Int
, por lo tanto [B >: A]
).
Cuando llame a foldLeft
say en un List[Int]
, plegará toda la lista (imagine rodar un trozo de papel) en un solo valor, pero este valor no tiene que estar relacionado Int
(por lo tanto [B]
).
Aquí hay un ejemplo:
def listWithSum(numbers: List[Int]) = numbers.foldLeft((List.empty[Int], 0)) {
(resultingTuple, currentInteger) =>
(currentInteger :: resultingTuple._1, currentInteger + resultingTuple._2)
}
Este método toma un List[Int]
y devuelve un Tuple2[List[Int], Int]
o (List[Int], Int)
. Calcula la suma y devuelve una tupla con una lista de enteros y es la suma. Por cierto, la lista se devuelve hacia atrás, porque usamos en foldLeft
lugar de foldRight
.
Mira One Fold para gobernarlos a todos y obtener una explicación más detallada.