在 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].
我希望它能清除您遇到编译错误的原因。
假设我有以下代码:
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.
现在,当您从第 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].
我希望它能清除您遇到编译错误的原因。