在scala中展平列表

时间:2017-11-02 19:50:48

标签: scala flatten

我已经跳进Scala并开始做scala99,但是我被困在P07(列表的扁平化)下面是我的代码和来自repl的错误消息

scala> def flatten[A](x: List[A]): List[A] =
 | for(i <- x) yield i match {
 | case lst: List[Any] => flatten(lst)
 | case e => List(e)
 | }
<console>:12: error: type mismatch;
found   : List[List[Any]]
required: List[A]
   for(i <- x) yield i match {
         ^

我错在哪里,正确的方法是什么? 感谢。

2 个答案:

答案 0 :(得分:1)

就像我在你对你的问题的评论中所说,我不知道为什么编译器会抱怨它的方式,但问题的根源在于你返回与输入相同的类型:如果你压扁List[List[Int]]输出结果为List[Int],那么代码中A会是什么?

我认为在这种情况下,类型参数确实可以用于任何目的,你最好只使用List[Any]

  def flatten(in: List[Any], out: List[Any] = Nil): List[Any] = in match { 
    case Nil => out.reverse
    case Nil :: t => flatten(t, out)
    case (h :: t) :: tail => flatten(h :: t ::: tail, out)
    case h :: t => flatten(t, h :: out)
  }

答案 1 :(得分:-1)

我使用这样的东西

def flatten(t: List[Any]): List[Any]
  = t.flatMap {
        case s: List[_] => flatten(s)
        case x => List(x)
      }

在您的情况下,编译器会抱怨,因为函数体明确返回类型List[List[_]]的值,并且没有任何内容可以使A从该类型派生。同时,由于顶级列表可能包含标量值,因此无法从List中导出A。最后,您的代码实际上并不压缩输入,它只是将每个标量值包装在单个元素列表中。