Тут потрібно згадати кілька речей, перш ніж дати відповідь:
- Ваше запитання не має нічого спільного
left
, скоріше про різницю між зменшенням і складанням
- Різниця зовсім не в реалізації, просто подивіться на підписи.
- Питання не має нічого спільного з Scala, зокрема, це стосується двох концепцій функціонального програмування.
Назад до свого питання:
Ось підпис foldLeft
(я також міг би бути foldRight
моментом, який я збираюся зробити):
def foldLeft [B] (z: B)(f: (B, A) => B): B
І ось підпис reduceLeft
(знову напрямок тут не має значення)
def reduceLeft [B >: A] (f: (B, A) => B): B
Ці два виглядають дуже схоже і, таким чином, викликали плутанину. reduceLeft
це окремий випадок foldLeft
(який, до речі, означає, що ви можете іноді висловити те саме, використовуючи будь-який з них).
Коли ви зателефонуєте reduceLeft
сказати на a, List[Int]
це буквально зведе весь список цілих чисел в єдине значення, яке буде типу Int
(або Int
, таким чином, і супертипом [B >: A]
).
Коли ви телефонуєте foldLeft
сказати на a, List[Int]
це складе весь список (уявіть, як закотити аркуш паперу) в одне значення, але це значення не повинно бути навіть пов'язане Int
(отже [B]
).
Ось приклад:
def listWithSum(numbers: List[Int]) = numbers.foldLeft((List.empty[Int], 0)) {
(resultingTuple, currentInteger) =>
(currentInteger :: resultingTuple._1, currentInteger + resultingTuple._2)
}
Цей метод приймає a List[Int]
і повертає a Tuple2[List[Int], Int]
або(List[Int], Int)
. Він обчислює суму і повертає кортеж зі списком цілих чисел і це сума. До речі, список повертається назад, тому що ми використовували foldLeft
замість цього foldRight
.
Дивіться один раз, щоб правити їх усі для більш глибокого пояснення.