在 Scala 中追加时列表类型不匹配

List type mismatch when appending in Scala

假设我有以下代码:

val xs: List[Int] = List(1, 2, 3)
val ys: List[Int] = List(4, 5, 6)
val zs: List[Int] = xs.appended(ys)

最后一行没有编译错误:

Error:(162, 33) type mismatch; found : List[Int] required: Int val zs: List[Int] = xs.appended(ys)

如果我删除显式类型声明,那么代码可以编译,但真正的问题是 错误消息出现在递归函数中,我想将附加列表作为类型 List[Int] 的参数传递,因此删除显式类型不是一个选项。

根据 scaladoc appended 方法只接受一个参数,而不是整个列表。所以下面的例子会编译:

xs.appended(ys(0))
for(x <- xs) yield ys appended x

appendAll:

xs appendAll ys
ys :++ xs

P.S.: 注意,附加到列表不是最优的,因为它的时间与列表的大小成正比,更喜欢前置:

ys ::: xs

根据 scala documentation appended 方法只接受一个元素,而不是集合。删除显式类型后的 zs 类型将是 List[Any]:

val xs = List(1, 2, 3)
val ys = List(4, 5, 6)
val zs: List[Any] = xs.appended(ys) // List(1, 2, 3, List(4, 5, 6))

它编译,但结果将是 List(1, 2, 3, List(4, 5, 6))

您可以使用方法 appendedAll 来完成您想要的操作,或者使用 concat++ 运算符连接列表:

val xs = List(1, 2, 3)
val ys = List(4, 5, 6)
val zs: List[Int] = xs ++ ys // List(1, 2, 3, 4, 5, 6)
val as: List[Int] = xs.appendedAll(ys) // List(1, 2, 3, 4, 5, 6)
val bs: List[Int] = xs.concat(ys) // List(1, 2, 3, 4, 5, 6)
1. val xs: List[Int] = List(1, 2, 3)
2. val ys: List[Int] = List(4, 5, 6)
3. val zs: List[Int] = xs.appended(ys)

第三行是一个问题,直到你有类型声明。因为当你编译你的代码时,编译器不会推断变量 zs 的类型,它会期望 xs.appended(ys) 的输出是一个 List[Int] 但事实并非如此,因为 xs 现在是 List[Int]如果您想在此列表中添加一个元素,您可以执行 xs.append(1) 或任何其他整数,但您正在尝试插入不是 Int.

的 List[Int]

现在,当您从第 3 行删除类型声明时,它会成功编译,因为现在编译器将推断变量 zs 的类型,如果您将在 REPL 上看到,它会说该变量 zs 的类型是 List[Any]。

现在,如果您想将列表添加到列表中并获得扁平化结果,您只需使用

val zs: List[Int] = xs ::: ys

如果您将看到 scala 文档 here

这是附加的签名:

final def:+[B >: A](elem: B): List[B]

:+ 是 appended

的别名

:++ 是 appendedAll

的别名

正如我们从签名附加函数中看到的那样,参数类型为 B 并且 return List[B] 在您的情况下 B 是 Int 并且您正在尝试添加 List[Int].

我希望它能清除您遇到编译错误的原因。