Scala类型不匹配 - 期望Int而不是Generic

时间:2018-01-12 10:05:54

标签: scala

我有一些代码可以压缩嵌套的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

3 个答案:

答案 0 :(得分:0)

outList(h) h outlisth。但Aapply类型的元素,而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())
}