Beberapa hal untuk disebutkan di sini, sebelum memberikan jawaban yang sebenarnya:
- Pertanyaan Anda tidak ada sangkut-pautnya dengan pertanyaan
left
, melainkan tentang perbedaan antara mengurangi dan melipat
- Perbedaannya bukan implementasi sama sekali, lihat saja tanda tangannya.
- Pertanyaannya tidak ada hubungannya dengan Scala pada khususnya, ini lebih tentang dua konsep pemrograman fungsional.
Kembali ke pertanyaan Anda:
Inilah tanda tangan foldLeft
(bisa juga foldRight
untuk poin yang akan saya buat):
def foldLeft [B] (z: B)(f: (B, A) => B): B
Dan di sini adalah tanda tangan reduceLeft
(lagi arah tidak masalah di sini)
def reduceLeft [B >: A] (f: (B, A) => B): B
Keduanya terlihat sangat mirip dan menyebabkan kebingungan. reduceLeft
adalah kasus khusus dari foldLeft
(yang omong-omong berarti bahwa Anda kadang - kadang dapat mengekspresikan hal yang sama dengan menggunakan salah satu dari mereka).
Ketika Anda memanggil reduceLeft
say pada a List[Int]
itu akan benar-benar mengurangi seluruh daftar bilangan bulat menjadi nilai tunggal, yang akan bertipe Int
(atau supertype Int
, karenanya [B >: A]
).
Ketika Anda menelepon foldLeft
mengatakan pada List[Int]
itu akan melipat seluruh daftar (bayangkan menggulung selembar kertas) menjadi nilai tunggal, tetapi nilai ini tidak harus bahkan terkait dengan Int
(karenanya [B]
).
Berikut ini sebuah contoh:
def listWithSum(numbers: List[Int]) = numbers.foldLeft((List.empty[Int], 0)) {
(resultingTuple, currentInteger) =>
(currentInteger :: resultingTuple._1, currentInteger + resultingTuple._2)
}
Metode ini mengambil List[Int]
dan mengembalikan a Tuple2[List[Int], Int]
atau (List[Int], Int)
. Ini menghitung jumlah dan mengembalikan tupel dengan daftar bilangan bulat dan jumlahnya. Ngomong-ngomong, daftar dikembalikan ke belakang, karena kami menggunakan foldLeft
alih-alih foldRight
.
Tonton One Fold untuk mengatur semuanya untuk penjelasan yang lebih mendalam.