1

我花了一段时间在 Google 上搜索非 Cats 三等式方法,但除了 Scalaz 之外找不到任何东西。不幸的是,我一直无法解决===这个库中的导入问题。

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

4

4 回答 4

6

如果你只需要===,你可以很容易地用你自己的函数模仿 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
*/
于 2019-08-20T11:35:48.923 回答
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
于 2019-08-20T12:02:17.893 回答
4

关于scalaz尝试

import scalaz._
import Scalaz._

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

在哪里

libraryDependencies += "org.scalaz" %% "scalaz-core" % "7.2.28"
于 2019-08-20T12:21:14.750 回答
3

在我的脑海中,其他使用的库===是例如:

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

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

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

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

Scalaz 也是如此,尽管导入和类型类将有其他名称。

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

于 2019-08-20T11:54:08.383 回答