在 Scala 的 Cats 之外是否有任何三重等于 === 方法?

Are there any triple equals === methods outside of Cats in Scala?

我花了一段时间在 Google 上搜索非 Cats 三重等于方法,但除了 Scalaz 之外找不到任何东西。不幸的是,我无法在该库中计算出 === 的导入。

谁能帮忙,非常感谢。

如果你只需要 ===,你可以很容易地用你自己的函数模仿猫的行为:

implicit class AnyWithTripleEquals[T](a: T) {
  def ===(b: T): Boolean = a equals b
}

/*
scala> "2" === "3"
res0: Boolean = false

scala> "2" === 3
<console>:13: error: type mismatch;
 found   : Int(3)
 required: String
       "2" === 3
*/

我想到其他使用 === 的库,例如:

但它与 Cats/Scalaz 中的用例不同。

如果你想在猫中使用它,你需要:

  • syntax - import cats.syntax.eq._ or import cats.syntax.all._ or import cats.implicits._ (如果你重复导入语法,Scala 将无法恢复它)
  • 实例 - 如果你比较 2 A,你需要一个 cats.Eq[A] 的隐式实例。 Lists、Maps 等的实例可以在 cats.instances.list._cats.instances.map._cats.instances.all._cats.implicits._ 中找到(与上述相同的规则) .所有 "normal" 类型都应该有实例,但如果您有自己的实例,则需要自己提供 Eq 实例或使用 Kittens.
  • 之类的东西派生它

如果您遗漏了某些隐式(或者如果某些隐式是模棱两可的,因为您从两个不同的地方导入了相同的东西)语法将不起作用。

尽管导入和类型 类 将有其他名称,但 Scalaz 也一样。

如果您不介意某些性能损失(由 equals 中的 isInstanceOf 引起)以及相等性检查定义缺乏灵活性,您可以使用@sachav 的解决方案。

另一个提供 === 的库是 scalactic,它基本上是 ScalaTest 使用的一组实用程序,它们被打包为一个单独的库。

import org.scalactic._
import TypeCheckedTripleEquals._

"Hello" === "Hello" //true
1 === "Hello" //won't compile

您还可以"configure"如何使用隐式解决您的平等问题:

import org.scalactic._
import TripleEquals._
import StringNormalizations._
import Explicitly._

implicit val strEquality = decided by defaultEquality[String] afterBeing lowerCased

"Hello" === "hello"                           // true
"normalized" === "NORMALIZED"                 // true

关于 scalaz 尝试

import scalaz._
import Scalaz._

42 === "hello" // error: type mismatch; found: String("hello") required: Int

哪里

libraryDependencies += "org.scalaz" %% "scalaz-core" % "7.2.28"