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
( foldRight
yapacağı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 reduceLeft
bir ü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 Int
dolayısıyla [B >: A]
).
Aradığınızda foldLeft
a 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 .