gpt4 book ai didi

scala - 无法证明 Unit < :< (T, U)

转载 作者:行者123 更新时间:2023-12-04 07:54:45 26 4
gpt4 key购买 nike

当试图删除所有 Unit - ()从列表中,我尝试调用 toMap .

scala> List((), ()).filter(_ != ()).toMap
<console>:8: error: Cannot prove that Unit <:< (T, U).
List((), ()).filter(_ != ()).toMap
^

这个错误是什么意思?

对于 List , 我想创建一个所有元组的映射 (String, String)对于非 Unit 元素,但某些值可以为 null。
scala> val x = List((), (), (3,4)).filter(_ != ()).toMap
<console>:7: error: Cannot prove that Any <:< (T, U).
val x = List((), (), (3,4)).filter(_ != ()).toMap
^

scala> val x = List((), (), (3,4)).filter(_ != ())
x: List[Any] = List((3,4))

scala> x.toMap
<console>:9: error: Cannot prove that Any <:< (T, U).
x.toMap
^

最佳答案

啊!现在your other question更有意义。仍然不确定你在做什么来产生这种混合 Unit/Tuple2虽然列出。

这应该有效:

List((), (), (3,4)).collect { case t@(_: Int, _: Int) => t }.toMap

请注意,我使用的是 variable binding这里(将匹配绑定(bind)到 t )返回我们匹配的同一个 Tuple2 实例,而不是创建一个新实例。

通过使用 collect您将列表的类型从 List[Any]List[(Int, Int)] ,这就是 toMap想要,因为它期待一些 List[(A,B)] .

注意:虽然这个答案应该对你有用,但我仍然认为你的设计有缺陷。您最好修复潜在的设计缺陷,而不是像这样对待症状。

看起来这很适合使用 Scala's Option type .在这种情况下,您的示例列表将变为 List(None, None, Some((3,4))) , 或者你可以写成 List(None, None, Some(3->4))为了可读性(这样的嵌套括号会让人感到困惑)。

如果您使用 Option那么您的列表类型变为 List[Option[(Int, Int)]] , 这应该比 List[Any] 更好处理.摆脱 None条目并获得所需的 List[(Int,Int)]您可以调用 flatten :
List(None, None, Some(3->4)).flatten
// res0: List[(Int, Int)] = List((3,4))
List(None, None, Some(3->4)).flatten.toMap
// res1: scala.collection.immutable.Map[Int,Int] = Map(3 -> 4)

但是,它将是 更好如果你能避免把 None首先在您的列表中的条目。如果您使用 Scala 生成此列表以进行理解,则可以 use a guard in your for expression从输出中删除无效元素。

关于scala - 无法证明 Unit < :< (T, U),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19303054/

26 4 0