我已经跳进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 {
^
我错在哪里,正确的方法是什么? 感谢。
答案 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
。最后,您的代码实际上并不压缩输入,它只是将每个标量值包装在单个元素列表中。