簡體   English   中英

Scala中的Cats之外是否有任何三元等於===方法?

[英]Are there any triple equals === methods outside of Cats in Scala?

我花了一段時間在Google上搜索了非貓三重等於方法,但除了Scalaz找不到任何東西。 不幸的是,我無法在此庫中計算===的導入。

有人可以幫忙,非常感謝。

如果您只需要=== ,則可以使用自己的函數輕松模擬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

在我的頭上,其他使用===庫例如:

但這與Cats / Scalaz中的用例不同。

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

  • 語法- import cats.syntax.eq._import cats.syntax.all._import cats.implicits._ (如果重復導入語法,Scala將無法解決它)
  • instance-如果比較2 A ,則需要cats.Eq[A]的隱式實例。 ListMap等等的實例可以在cats.instances.list._cats.instances.map._cats.instances.all._cats.implicits._ (與上述規則相同)。 所有“普通”類型都應該有實例,但是如果您有自己的實例,則需要自己提供Eq實例,或者使用Kittens之類派生它。

如果您缺少一些隱式(或者某些隱式是模棱兩可的,因為您從2個不同的地方導入了相同的內容),則該語法將不起作用。

關於Scalaz的事情也一樣,盡管導入和類型類將具有其他名稱。

如果您不介意性能下降(由isInstanceOf內部equals引起)並且缺乏關於相等性檢查定義的靈活性,則可以使用@sachav的解決方案。

關於scalaz嘗試

import scalaz._
import Scalaz._

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

哪里

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM