运行Scala代码时发现类型不匹配

时间:2018-10-11 13:54:38

标签: scala

下面的代码说类型List[Any]的表达式不符合预期的类型List[List[Int]]

def tran(l1:List[List[Int]]):List[List[Int]] ={
  if(l1.isEmpty) Nil
  else
    l1.head.head :: tran(l1.tail) // Type mismatch is happening here 
}

下面的代码执行正常,没有问题

def tran1(l1:List[List[Int]]):List[List[Int]] = {
  if (l1.isEmpty) Nil
  else
    l1.head.tail :: tran1(l1.tail) // This is executing fine
}

2 个答案:

答案 0 :(得分:0)

您期望使用列表列表,因此应将列表添加到:List(l1.head.head)

 def tran(l1: List[List[Int]]): List[List[Int]] = {
     if (l1.isEmpty) Nil else List(l1.head.head) :: tran(l1.tail) // Type mismatch is happening here }
  }

答案 1 :(得分:0)

tran1(l1.tail)的类型为List[List[Int]](返回类型为tran1),而l1的类型为List[List[Int]]。 但是,l1.head.head不是List[Int]类型。它是Int类型。 因此,在第一种情况下,您尝试在Int类型的对象之前添加List[List[Int]]。 这就是为什么在第一种情况下会出现类型不匹配错误的原因。

现在,在第二种情况下,l1.head.tail的类型为List[Int],而您尝试将其前缀为List[List[Int]]类型的对象,即tran1(l1.tail)。这就是为什么这里没有错误。