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

时间:2019-08-20 11:16:10

标签: scala equals scalaz scala-cats triple-equals

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

有人可以帮忙,非常感谢。

4 个答案:

答案 0 :(得分:5)

如果您只需要===,则可以使用自己的功能很容易地模仿Cats的行为:

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
*/

答案 1 :(得分:4)

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

import org.scalactic._
import TypeCheckedTripleEquals._

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

您还可以“配置”如何使用隐式方法解决平等问题:

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

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

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

答案 2 :(得分:3)

使用===的其他库例如是:

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

如果要在Cats中使用它,则需要:

  • 语法-import cats.syntax.eq._import cats.syntax.all._import cats.implicits._(如果重复导入语法,Scala将无法解决它)
  • 实例-如果您比较2个A,则需要隐式实例cats.Eq[A]ListMap等的实例可以在cats.instances.list._cats.instances.map._cats.instances.all._cats.implicits._中找到(与上述规则相同) 。所有“普通”类型都应该有实例,但是如果您有自己的实例,则需要自己提供Eq实例,或者使用类似Kittens的实例派生它。

如果您缺少某些隐式(或者某些隐式是模棱两可的,因为您从2个不同的地方导入了相同的内容),则语法将无效。

与Scalaz相同,尽管导入和类型类将具有其他名称。

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

答案 3 :(得分:3)

关于scalaz试试

import scalaz._
import Scalaz._

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

其中

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