Einige Dinge, die hier zu erwähnen sind, bevor die eigentliche Antwort gegeben wird:
- Ihre Frage hat nichts damit zu tun
left
, es geht vielmehr um den Unterschied zwischen Reduzieren und Falten
- Der Unterschied ist überhaupt nicht die Implementierung, schauen Sie sich nur die Signaturen an.
- Die Frage hat insbesondere nichts mit Scala zu tun, sondern handelt von den beiden Konzepten der funktionalen Programmierung.
Zurück zu Ihrer Frage:
Hier ist die Unterschrift von foldLeft
(könnte auch foldRight
für den Punkt gewesen sein, den ich machen werde):
def foldLeft [B] (z: B)(f: (B, A) => B): B
Und hier ist die Unterschrift von reduceLeft
(auch hier spielt die Richtung keine Rolle)
def reduceLeft [B >: A] (f: (B, A) => B): B
Diese beiden sehen sich sehr ähnlich und haben somit die Verwirrung verursacht. reduceLeft
ist ein Sonderfall von foldLeft
(was übrigens bedeutet, dass Sie manchmal dasselbe ausdrücken können, indem Sie einen von beiden verwenden).
Wenn Sie reduceLeft
say on a aufrufen , List[Int]
wird die gesamte Liste der Ganzzahlen buchstäblich auf einen einzigen Wert reduziert, der vom Typ Int
(oder Int
daher vom Supertyp von [B >: A]
) sein wird.
Wenn Sie foldLeft
say on a aufrufen , List[Int]
wird die gesamte Liste (stellen Sie sich vor, Sie rollen ein Stück Papier) zu einem einzigen Wert zusammengefasst, aber dieser Wert muss nicht einmal mit Int
(daher [B]
) verknüpft sein .
Hier ist ein Beispiel:
def listWithSum(numbers: List[Int]) = numbers.foldLeft((List.empty[Int], 0)) {
(resultingTuple, currentInteger) =>
(currentInteger :: resultingTuple._1, currentInteger + resultingTuple._2)
}
Diese Methode nimmt ein List[Int]
und gibt ein Tuple2[List[Int], Int]
oder zurück (List[Int], Int)
. Es berechnet die Summe und gibt ein Tupel mit einer Liste von ganzen Zahlen und seiner Summe zurück. Übrigens wird die Liste rückwärts zurückgegeben, weil wir foldLeft
statt verwendet haben foldRight
.
Beobachten Sie One Fold, um sie alle zu regieren und eine ausführlichere Erklärung zu erhalten.