foldLeft işlemlerinin çoğunda çok daha etkili olduğunu duydum, ancak Scala School (Twitter'dan) aşağıdaki örneği verdi. Birisi verimliliğinin bir analizini verebilir ve foldLeft kullanarak aynı işlemi yapalım mı?foldRight Verimliliği?
val numbers = List(1,2,3,4,5,...10)
def ourMap(numbers: List[Int], fn: Int => Int): List[Int] = {
numbers.foldRight(List[Int]()) { (x: Int, xs: List[Int]) =>
fn(x) :: xs
}
}
scala> ourMap(numbers, timesTwo(_))
res0: List[Int] = List(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)
Son ifadeyle ilgili cevabınızı açıklayabilir miyim? FoldRight'ın foldLeft'dan genel olarak% 10 -% 40 daha hızlı olması durum değildir, ancak bir ters işlem yapıldığında bu fark beklenir. Bir sol veya sağ bir kat arasında seçim yaparken, bir sağ kat için ihtiyaç duyulan yığın yığınının muhtemel yüksek maliyeti, buna karşı sayar, ancak bir tersin yüksek maliyeti, bir tersine katlanan bir katlama kullanılmasına karşı sayılır. FoldLeft (ters olmadan) bir seçenek ise, genel olarak tercih edilen seçenek olarak görünüyor. –
Not: Listenin 'foldRight''nın Scala'nın son sürümlerinde sol katlamayı + tersine çevirdiğini, muhtemelen yığın taşmasını önlemek için inanıyorum –