Gerçek cevabı vermeden önce burada belirtilecek birkaç şey:
- Sorunuzla hiçbir ilgisi yok
left, daha çok azaltma ve katlama arasındaki farkla ilgili
- Fark uygulama değildir, sadece imzalara bakın.
- Sorunun özellikle Scala ile bir ilgisi yok, daha ziyade fonksiyonel programlamanın iki kavramı hakkında.
Sorunuza geri dönün:
İşte imzası foldLeft ( foldRightyapacağım nokta için de olabilirdi ):
def foldLeft [B] (z: B)(f: (B, A) => B): B
Ve işte imzası reduceLeft (yine yön burada önemli değil)
def reduceLeft [B >: A] (f: (B, A) => B): B
Bu ikisi birbirine çok benzer ve karışıklığa neden oldu. reduceLeftözel bir durumfoldLeft (bu arada bazen aynı şeyi ikisinden birini kullanarak ifade edebileceğiniz anlamına gelir ).
Aradığınızda reduceLeftbir üzerinde söz sahibi List[Int]bu anlamıyla Çeşidi olacak tek bir değer, içine tamsayılar bütün liste azaltacaktırInt (veya bir süpertip Intdolayısıyla [B >: A]).
Aradığınızda foldLefta söylemekList[Int] tek bir değere (kağıt parçası haddeleme hayal) tüm listeyi kat edeceği, ancak bu değer bile ilişkili olmak zorunda değildir Int(dolayısıyla [B]).
İşte bir örnek:
def listWithSum(numbers: List[Int]) = numbers.foldLeft((List.empty[Int], 0)) {
(resultingTuple, currentInteger) =>
(currentInteger :: resultingTuple._1, currentInteger + resultingTuple._2)
}
Bu yöntem a alır List[Int]ve a Tuple2[List[Int], Int]veya döndürür (List[Int], Int). Toplamı hesaplar ve bir tamsayılar listesi içeren bir tuple döndürür. Bu arada liste geri döndürülür, çünküfoldLeft yerinefoldRight .
Daha ayrıntılı bir açıklama için hepsini yönetmek için Bir Katlamayı izleyin .