[英]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.