Существуют ли методы тройного равенства === за пределами Cats в Scala?

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

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


person J Hubbard    schedule 20.08.2019    source источник
comment
Какую проблему ты пытаешься решить? Почему вы ищете варианты использования ===? Если вы сможете уточнить свой вопрос, вы можете получить более релевантные ответы.   -  person drstevens    schedule 20.08.2019


Ответы (4)


По поводу scalaz попробуй

import scalaz._
import Scalaz._

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

куда

libraryDependencies += "org.scalaz" %% "scalaz-core" % "7.2.28"
person Mario Galic    schedule 20.08.2019

Если все, что вам нужно, это ===, вы можете очень легко имитировать поведение 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
*/
person sachav    schedule 20.08.2019
comment
Это большое спасибо, просто я запускаю wartremoval через свой код, а equals отключен, а также == - person J Hubbard; 20.08.2019

Другой библиотекой, предоставляющей ===, является 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
person Krzysztof Atłasik    schedule 20.08.2019
comment
TypeCheckedTripleEquals._ может понадобиться для проверки времени компиляции. - person Mario Galic; 20.08.2019
comment
Спасибо, надеюсь, это импорт для сравнения Option[String] s - person J Hubbard; 20.08.2019

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

но это не тот вариант использования, что и в 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.

person Mateusz Kubuszok    schedule 20.08.2019