Scala:为什么foldLeft不能用于两个列表的连接?

Som*_*kar 5 scala list fold

使用foldRight定义如下的concat函数可以正确连接列表

def concat[T](xs: List[T], ys: List[T]): List[T] = (xs foldRight(ys))(_ :: _)
Run Code Online (Sandbox Code Playgroud)

但是使用foldLeft这样做

def concat1[T](xs: List[T], ys: List[T]): List[T] = (xs foldLeft(ys))(_ :: _)
Run Code Online (Sandbox Code Playgroud)

导致编译错误value :: is not a member of type parameter T,需要帮助理解这种差异.

编辑:

以防万一有人可能正在寻找折叠的详细解释 http://lampwww.epfl.ch/teaching/programmation_avancee/documents/programmation_avancee_5_en-2x2.pdf

sen*_*nia 12

参数顺序foldLeft与中的不同foldRight.

xs.foldRight(ys){(element, aggregator) => element :: aggregator}

xs.foldLeft(ys){(aggregator, element) => element :: aggregator}
Run Code Online (Sandbox Code Playgroud)

使用占位符语法foldLeft- (_ :: _)- 您正在尝试执行以下操作:aggregator :: element.这意味着 element.::(aggregator)并且没有::方法element(类型elementT).

  • @SomasundaramSekar看看文档会回答这个问题.另外http://stackoverflow.com/questions/6253978/difference-between-fold-and-foldleft-or-foldright和http://stackoverflow.com/questions/1446419/how-do-you-know-when-to -use倍 - 左 - 当使用的倍右 (3认同)
  • @SomasundaramSekar:除了Paul的评论:注意`List`上的`foldRight`是[实现](https://github.com/scala/scala/blob/v2.11.3/src/library/scala/collection/immutable /List.scala#L397)作为`reverse` +`foldLeft`,因为`reverse`是从列表到第一个元素遍历`List`的最佳方法. (3认同)