Существуют ли какие-либо методы с тройным равенством === вне Cats в Scala?

Я потратил некоторое время на поиск в Google не тройного метода равных Cats, но не могу найти ничего кроме Scalaz. К сожалению, я не смог отработать импорт для === в этой библиотеке.

Может кто-то помочь, большое спасибо.

4 ответа

Решение

По поводу скаляза попробуй

import scalaz._
import Scalaz._

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

где

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

Если все, что вам нужно, это ===Вы можете очень легко имитировать поведение 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
*/

Из головы моей головы другие библиотеки, которые используют === Например:

но это не тот же вариант использования, что и в Cats/Scalaz.

Если вы хотите использовать его в Cats, вам нужно:

  • синтаксис - import cats.syntax.eq._ или же import cats.syntax.all._ или же import cats.implicits._ (если вы дублируете импорт синтаксиса, Scala не сможет его восстановить)
  • экземпляр - если сравнить 2 A вам нужен неявный экземпляр cats.Eq[A], случаи для Lists, MapS и т. д. можно найти в cats.instances.list._, cats.instances.map._, cats.instances.all._ или же cats.implicits._ (то же правило, что и выше). Должны быть экземпляры для всех "нормальных" типов, но если у вас есть свой, вам нужно предоставить Eq экземпляр по своему усмотрению или получить его с чем-то вроде котят.

Если вам не хватает неявного (или если неявное нечетко, потому что вы импортировали одни и те же вещи из двух разных мест), синтаксис не будет работать.

То же самое в Scalaz, хотя у классов импорта и типов будут другие имена.

Если вы не возражаете против некоторого снижения производительности (вызвано isInstanceOf внутри equals) и отсутствие гибкости в отношении определения проверки на равенство, вы можете использовать решение @sachav.

Еще одна библиотека, которая обеспечивает === является скалярным, который в основном представляет собой набор утилит, используемых 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
Другие вопросы по тегам