繁体   English   中英

在 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)

最后一行没有编译错误:

错误:(162, 33) 类型不匹配; 找到:List[Int] 需要:Int val zs:List[Int] = xs.appended(ys)

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

根据scaladoc appended方法只需要一个参数,而不是整个列表。 因此,以下示例将编译:

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

appendAll

xs appendAll ys
ys :++ xs

PS:请注意,附加到列表不是最佳的,因为它的时间与列表的大小成正比,更喜欢 prepend 代替:

ys ::: xs

根据scala 文档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)的 output 是 List[Int] ,但事实并非如此,因为 xs 是 List[Int]现在,如果您想在此列表中添加一个元素,您可以执行xs.append(1)或任何其他 integer 但您尝试插入不是 Int 的 List[Int]。

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

现在,如果您想将列表添加到列表中并获得展平结果,您可以简单地使用

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

如果您会在此处看到 scala 文档

这是附加的签名:

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

:+ 是附加的别名

:++ 是 appendedAll 的别名

正如我们从附加的签名中看到的 function 采用 B 类型的参数并在您的情况下返回 List[B] B 是 Int 并且您正在尝试添加 List[Int]。

我希望它可以清除您收到编译错误的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM