我有一些代码可以压缩嵌套的List,看起来像这样
def flattenList[A](list : List[A]) : List[A] =
{
def flattenIt(inList : List[A], outList : List[A]) : List[A] = inList match
{
case Nil => Nil
case (h : List[A])::tail => flattenIt(h, outList):::flattenIt(h, outList)
case h::tail => flattenIt(tail, outList(h)) //Here's where the error occurs
}
flattenIt(list, List())
}
val nestedList = List(1, List(2, 3, 4), 5, List(6, 7, 8), 9, 10)
println(flattenList(nestedList))
但是我收到编译时错误
[ERROR] C:\***\src\main\scala\com\***\FlattenList.scala:19: error: type mismatch;
[INFO] found : A
[INFO] required: Int
[INFO] case h::tail => flattenIt(tail, outList(h))
[INFO] ^
现在我已将outList声明为outList : List[A]
,因此它应该是A
而不是Int
。
有人能告诉我为什么代码要求Int
答案 0 :(得分:0)
在outList(h)
h
outlist
到h
。但A
是apply
类型的元素,而List
的{{1}}需要一个索引,该索引必须是Int
。
您的类型签名似乎也不匹配。您想将List[A]
展平为List[A]
吗?这没有任何意义。
答案 1 :(得分:0)
您可以尝试这样的事情:
def flatten[A](x: List[A]):List[_] = {
x flatMap {
case n: List[A] => flatten(n)
case e:A => List(e)
}
}
尝试使用flatten(List(List(1, 1), 2, List(3, List(5, 8)))))
输出
List(1,1, 2, 3, 5,8)
答案 2 :(得分:-1)
问题在于这一行
case h::tail => flattenIt(tail, outList(h))
应该是这个
case h::tail => flattenIt(tail, outList:::List(h))
这解决了错误。另外
case (h : List[A])::tail => flattenIt(h, outList):::flattenIt(h, outList)
应该是
case (h : List[A])::tail => flattenIt(tail, outList:::h)
和case Nil => Nil
变为case Nil => outList
所以,flattenList
变为
def flattenList[A](list : List[A]) : List[A] =
{
def flattenIt(inList : List[A], outList : List[A]) : List[A] = inList match
{
case Nil => outList
case (h : List[A])::tail => flattenIt(tail, outList:::h)
case h::tail => flattenIt(tail, outList:::List(h))
}
flattenIt(list, List())
}