gpt4 book ai didi

scala - 空列表平等如何工作?

转载 作者:行者123 更新时间:2023-12-02 06:13:38 27 4
gpt4 key购买 nike

== 运算符真的按内容比较 List 吗?特别是关于空列表?

以下比较按预期工作

List("A", "B", "C") == "ABC".split("").toList // true
List() == List() // true
List.empty[String] == List.empty[String] // true

但是,不同类型的空列表比较会给出令人困惑的结果:

List.empty[String] == List.empty[Int] // true: on different types?

编辑:在最初的问题中,我做了一个误导性的测试用例,安德烈已经澄清了这一点。谢谢。转载于此

val emptyStrSplit = "".split("").toList // List("") and not List() as displayed in Console
List.empty[String] == emptyStrSplit // false: b/c List() != List("")

最佳答案

  • List.empty[String] 是单例对象 Nil,它扩展了 List[Nothing](协变地, 的子类型列表[String]).
  • List.empty[Int] 是单例对象 Nil,它扩展了 List[Nothing](协变地, 的子类型列表[Int]).
  • 每个单例对象都等于它自己。
  • 因此,Nil == Nil 给出 true。

因此,本质上,您有一个对象 Nil,它同时属于 List[String] 类型和 List[Int] 类型.如果你有子类型,这就是你得到的。我在这里没有看到任何奇怪或矛盾的地方。

如果要确保类型相同,可以使用类型为A =:= Bimplicit证据,默认值为null,然后检查编译器是否提供了一个非null的证据:

def eqSameType[A, B](a: A, b: B)(implicit ev: A =:= B = null) = 
if (ev == null) false else a == b

例子:

scala> eqSameType(List.empty[Int], List.empty[String])
res4: Boolean = false

关于scala - 空列表平等如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51458704/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com