如何在scala中替换:::

时间:2016-02-04 05:33:16

标签: list scala

我从头开始编写了一个flatten函数,它将一个嵌套列表作为输入并输出另一个。

def flatten[A] (list:List[List[A]]):List[A]

我使用scala的':::'来绑定两个列表,它运行正常。但是,我的练习禁止我使用那种或任何内置的方法(从个人scala书中练习)。

现在,我编写了一个帮助方法,它合并了这两个名为merge的列表。

如何在新版本的函数中展开合并?

2 个答案:

答案 0 :(得分:0)

如果您有方法合并,可以使用 foldLeft 来展平列表列表:

list.foldLeft(List[A]())(merge)

答案 1 :(得分:0)

  def merge1[T](l1: List[T], l2: List[T]): List[T] = 
       l1.reverse.foldLeft(l2)((acc, e) => e :: acc)

  /** for large lists will throws Stackoverflow */
  def merge2[T](l1: List[T], l2: List[T]): List[T] = 
       l1.foldRight(l2)((e, acc) => e :: acc)


  def flatten[A](list: List[List[A]]): List[A] = 
       list.foldLeft(Nil: List[A])(merge1)

如果您想将merge方法添加到List类型,可以写下:

  implicit class ListExt[T](l: List[T]) {
    def merge(l2: List[T]): List[T] = merge1(l, l2)
  }


  def flatten2[A](list: List[List[A]]): List[A] = 
    list.foldLeft(Nil: List[A])((acc, e) => acc merge e)