Я потратил некоторое время на поиск в Google метода тройного равенства, отличного от Cats, но не могу найти ничего, кроме Scalaz. К сожалению, мне не удалось выполнить импорт для ===
в этой библиотеке.
Может кто поможет, большое спасибо.
Я потратил некоторое время на поиск в Google метода тройного равенства, отличного от Cats, но не могу найти ничего, кроме Scalaz. К сожалению, мне не удалось выполнить импорт для ===
в этой библиотеке.
Может кто поможет, большое спасибо.
По поводу scalaz попробуй
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
*/
Другой библиотекой, предоставляющей ===
, является 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
В верхней части моей головы другие библиотеки, которые используют ===
, например:
===
вместо =
в запросах - http://slick.lightbend.com/doc/3.3.1/queries.html===
для проверки утверждений и (обычно) выдачи ошибки утверждения, иногда с хорошей разницей (думаю, самая масштабная?)но это не тот вариант использования, что и в Cats/Scalaz.
Если вы хотите использовать его в Cats, вам нужно:
import cats.syntax.eq._
или import cats.syntax.all._
или import cats.implicits._
(если вы продублируете импорт синтаксиса, Scala не сможет его восстановить)A
, вам нужен неявный экземпляр cats.Eq[A]
. экземпляры для List
s, Map
s и т. д. можно найти в cats.instances.list._
, cats.instances.map._
, cats.instances.all._
или cats.implicits._
(то же правило, что и выше). Должны быть экземпляры для всех «обычных» типов, но если у вас есть свои собственные, вам нужно либо предоставить экземпляр Eq
самостоятельно, либо получить его с помощью чего-то вроде Котята.Если вам не хватает какого-то неявного (или если какое-то неявное неоднозначно, потому что вы импортировали одни и те же вещи из двух разных мест), синтаксис не будет работать.
То же самое и со Scalaz, хотя классы импорта и типов будут иметь другие имена.
Если вы не возражаете против некоторого снижения производительности (вызванного isInstanceOf
внутри equals
) и отсутствия гибкости в отношении определения проверки на равенство, вы можете использовать решение @sachav.
===
? Если вы сможете уточнить свой вопрос, вы можете получить более релевантные ответы. - person drstevens   schedule 20.08.2019