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 foldRightuntuk 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. reduceLeftadalah 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 reduceLeftsay 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 foldLeftmengatakan 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 foldLeftalih-alih foldRight.
Tonton One Fold untuk mengatur semuanya untuk penjelasan yang lebih mendalam.