【发布时间】:2014-06-23 16:11:02
【问题描述】:
之前,Nicolas Rinaudo 在 Scala 的 List foldRight Always Using foldLeft? 上回答了我的问题
目前正在学习Haskell,我的理解是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)
foldRight 对每个项目执行带有 :: 运算符的 foldLeft,但随后反转。
scala> List("foo", "bar").foldRight(List[String]()) {
(elem, acc) => elem :: acc }
res10: List[String] = List(foo, bar)
实际上,鉴于foldRight 使用foldRight,在Scala 中使用foldLeft 或foldRight 是否重要?
【问题讨论】:
-
我想你会发现在当前版本的Scala中,
foldLeft并没有按照foldRight来实现,至少对于列表来说:github.com/scala/scala/blob/2.12.x/src/library/scala/collection/… -
不,
foldLeft没有按照foldRight实现。List则相反:github.com/scala/scala/blob/…