私はfoldLeftがほとんどの操作においてはるかに効率的だと聞きましたが、Scala School(Twitterから)は次の例を示しました。誰かがその効率を分析できますか?foldLeftを使用して同じ操作を達成する必要がありますか?foldRight効率?
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)
最後の声明に関する回答を明確にすることはできますか? foldRightがfoldLeftよりも一般的に10%-40%速い場合はありませんが、逆の操作が含まれている場合、この違いが予想されます。左か右の折りたたみの間で選択すると、右の折りたたみに必要なスタックフレームのコストが高くなる可能性がありますが、逆の場合はfoldLeftを使用することにコストがかかります。 foldLeft(反転なし)がオプションである場合、全体的に好ましい選択肢のようです。 –
私は 'List'の' foldRight'は最近のバージョンのScalaでfold + reverseを残していると思います。スタックオーバーフローを避けるためです –