【问题标题】:Scala: Why foldLeft can't work for an concat of two list?Scala:为什么 foldLeft 不能用于两个列表的连接?
【发布时间】:2014-12-17 13:45:19
【问题描述】:

使用 foldRight 定义如下 concat 函数可以正确 concat list

def concat[T](xs: List[T], ys: List[T]): List[T] = (xs foldRight(ys))(_ :: _)

但是用 foldLeft 这样做

def concat1[T](xs: List[T], ys: List[T]): List[T] = (xs foldLeft(ys))(_ :: _)

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

编辑:

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

【问题讨论】:

标签: list scala fold


【解决方案1】:

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

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

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

使用foldLeft - (_ :: _) 的占位符语法 - 你正在尝试做这样的事情:aggregator :: element。这个meanselement.::(aggregator)element 中没有:: 方法(element 的类型是T)。

【讨论】:

  • 它们在概念上有何不同以及我可以分别使用哪些场景
  • @SomasundaramSekar 查看文档会回答这个问题。还有stackoverflow.com/questions/6253978/…stackoverflow.com/questions/1446419/…
  • @SomasundaramSekar foldLeft 对于 List 来说更自然。 foldRight 需要先反转列表,速度较慢。
  • @SomasundaramSekar:除了保罗的评论:请注意List 上的foldRightimplemented 作为reverse + foldLeft,因为reverse 是遍历@987654343 的最佳方式@ 从 lats 到第一个元素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 2015-04-23
  • 2020-07-16
  • 2021-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多