Peu de choses à mentionner ici, avant de donner la réponse exacte:
- Votre question n'a rien à voir avec
left
, c'est plutôt à propos de la différence entre la réduction et le pliage
- La différence n'est pas la mise en œuvre à tous, il suffit de regarder les signatures.
- La question n'a rien à voir avec Scala en particulier, c'est plutôt sur les deux concepts de la programmation fonctionnelle.
Pour revenir à ta question:
Ici est la signature d' foldLeft
(il pourrait aussi avoir été foldRight
pour le point, je vais faire):
def foldLeft [B] (z: B)(f: (B, A) => B): B
Et voici la signature de l' reduceLeft
(à nouveau la direction n'a pas d'importance ici)
def reduceLeft [B >: A] (f: (B, A) => B): B
Ces deux sont très similaires et ainsi provoqué la confusion. reduceLeft
est un cas spécial de l' foldLeft
(qui signifie que vous parfois peut exprimer la même chose en utilisant l'un ou l'autre).
Lorsque vous appelez reduceLeft
- dire sur un List[Int]
il va littéralement réduire l'ensemble de la liste d'entiers en une seule valeur, qui va être de type Int
(ou un supertype de Int
, par conséquent [B >: A]
).
Lorsque vous appelez foldLeft
- dire sur un List[Int]
il va se plier à l'ensemble de la liste (imagerie rouler un morceau de papier) en une seule valeur, mais cette valeur ne doit pas être liés, même à l' Int
(d'où l' [B]
).
Voici un exemple:
def listWithSum(numbers: List[Int]) = numbers.foldLeft((List[Int](), 0)) {
(resultingTuple, currentInteger) =>
(currentInteger :: resultingTuple._1, currentInteger + resultingTuple._2)
}
Cette méthode prend un List[Int]
et renvoie un Tuple2[List[Int], Int]
ou (List[Int] -> Int)
. Il calcule la somme et renvoie un tuple avec une liste d'entiers et de la somme. Par la façon dont la liste est retournée en arrière, parce que nous avons utilisé foldLeft
au lieu de foldRight
.