Tôi nghe foldLeft hiệu quả hơn nhiều trong hầu hết các hoạt động, nhưng trường Scala (từ Twitter) đưa ra ví dụ sau. Ai đó có thể đưa ra một phân tích về hiệu quả của nó và chúng ta có nên đạt được cùng một hoạt động bằng cách sử dụng foldLeft không?foldRight Hiệu quả?
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)
Tôi có thể làm rõ câu trả lời của bạn về câu cuối cùng không? Nó không phải là trường hợp foldRight nói chung nhanh hơn gấp 10% -40% so với foldLeft, nhưng khi một hoạt động ngược lại được bao gồm thì sự khác biệt này được mong đợi. Khi lựa chọn giữa một trái hoặc một nếp gấp bên phải, chi phí có thể cao của khung stack cần thiết cho một nếp gấp bên phải chống lại nó, nhưng chi phí cao của một đảo ngược đếm ngược lại bằng cách sử dụng một foldLeft với một đảo ngược. Nếu foldLeft (không đảo ngược) là một lựa chọn, nó có vẻ là sự lựa chọn thích hợp hơn. –
Lưu ý, tôi tin rằng 'Danh sách' của' foldRight' chỉ làm trái gấp + đảo ngược trong các phiên bản gần đây của Scala, có lẽ để tránh tràn ngăn xếp –