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

2023-11-27

当尝试删除所有Unit - ()从列表中,我尝试打电话toMap.

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

这个错误是什么意思?

For a 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
                ^

Ah! Now 你的另一个问题更有意义一点。仍然不确定你正在做什么来生产这种混合的Unit/Tuple2不过列出来。

这应该有效:

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

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

通过使用collect您将列表的类型转换为List[Any] to 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 生成此列表以进行理解,您可以在 for 表达式中使用守卫从输出中删除无效元素。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法证明 Unit <:< (T, U) 的相关文章

随机推荐