以前,Nicolas Rinaudo回答了我关于Scala 列表的问题foldRight总是使用foldLeft?
目前正在研究Haskell,我的理解是,在(prepend)可以使用(append)的情况下foldRight应该优先考虑.foldLeft::++
据我所知,原因是性能 - 前者发生在O(1),即在前面添加一个项目 - 恒定时间.而后者需要O(N),即遍历整个列表并添加项目.
在Scala中,因为foldLeft是在以下方面实现的foldRight,不使用的好处:+在++与foldRight连问题,因为foldRight被逆转,然后foldLeft'd?
例如,考虑这个简单的fold..操作,只需按顺序返回列表的元素.
foldLeft折叠每个元素,将每个项目添加到列表中:+.
scala> List("foo", "bar").foldLeft(List[String]()) {
(acc, elem) => acc :+ elem }
res9: List[String] = List(foo, bar)
Run Code Online (Sandbox Code Playgroud)
foldRight::在每个项目上使用运算符执行foldLeft ,然后反转.
scala> List("foo", "bar").foldRight(List[String]()) {
(elem, acc) => elem :: acc }
res10: List[String] = List(foo, bar)
Run Code Online (Sandbox Code Playgroud)
实际上,在Scala中哪个foldLeft …