Существуют ли какие-либо методы с тройным равенством === вне 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
*/
Из головы моей головы другие библиотеки, которые используют ===
Например:
- Слик использует
===
за=
в запросах - http://slick.lightbend.com/doc/3.3.1/queries.html - соответствия в тестовых средах, например, https://github.com/etorreborre/specs2/blob/8305db76c5084e4b3ce5827ce23117f6fb6beee4/matcher/shared/src/main/scala/org/specs2/matcher/TypedEqual.scala use
===
проверять утверждения и (обычно) вызывать ошибку утверждений, иногда с некоторыми хорошими различиями (думаю, я думаю, самый масштабный?)
но это не тот же вариант использования, что и в Cats/Scalaz.
Если вы хотите использовать его в Cats, вам нужно:
- синтаксис -
import cats.syntax.eq._
или жеimport cats.syntax.all._
или жеimport cats.implicits._
(если вы дублируете импорт синтаксиса, Scala не сможет его восстановить) - экземпляр - если сравнить 2
A
вам нужен неявный экземплярcats.Eq[A]
, случаи дляList
s,Map
S и т. д. можно найти в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