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 foldRightpara 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. reduceLeftes un caso especial de foldLeft(que por cierto significa que a veces puedes expresar lo mismo usando cualquiera de ellos).
Cuando llame a reduceLeftsay 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 foldLeftsay 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 foldLeftlugar de foldRight.
Mira One Fold para gobernarlos a todos y obtener una explicación más detallada.