私はScala with Catsを読んでいました。本の最初の章では、Eq
の使い方を説明しています。cat `Eq`の` === `Scalatestで
練習の1つは、2つの猫の等価性を検証するためのその型クラスのインスタンスを書くことです。このことを考えてみましょう:
モデル
final case class Cat(name: String, age: Int, color: String)
型クラスのインスタンス
import cats.Eq
import cats.syntax.eq._
import cats.instances.string._
import cats.instances.int._
import co.alejandrome.typeclass.model.Cat
object CatsEqInstances {
implicit val catsEq: Eq[Cat] = Eq.instance[Cat] {
(cata, catb) =>
cata.color === catb.color && cata.age === catb.age && cata.name === catb.name
}
}
ユニットは
import co.alejandrome.typeclass.model.Cat
import org.scalatest.{FlatSpec, Matchers}
import cats.instances.option._
class EqTest extends FlatSpec with Matchers{
import CatsEqInstances._
"Eq" should "compare two cats" in {
val cat1 = Cat("Garfield", 38, "orange and black")
val cat2 = Cat("Heathcliff", 33, "orange and black")
catsEq.eqv(cat1, cat2) shouldBe false
val cat3 = Cat("Garfield", 38, "orange and black")
catsEq.eqv(cat1, cat3) shouldBe true
}
it should "compare two Optional cats" in {
val cat1 = Cat("Garfield", 38, "orange and black")
//val cat2 = Cat("Heathcliff", 33, "orange and black")
val optionCat1 = Option(cat1)
val optionCat2 = Option.empty[Cat]
optionCat1 === optionCat2
}
}
テスト
最初のテストは正常に動作しますが、===
演算子がスカラテストのものであり、Eq
でないため、2番目のテストはうまく動作しません。
typeclassに構文や暗黙的な説明がありますが、何も見つかりませんでした。私はに基づいて、このための解決策があると見ましたが、これは猫自身の単体テストのためのものです。this PR
私はEqSyntax
形質に突っついたが、私は===
の scalatest独自の実装をオーバーライドするためにどのようにそれを把握することはできません。
これを行う方法はありますか?それともこれはまだ実装されていないのですか?
おかげ
これは私が欲しかったものです!私はそのクラスを見てきましたが(StrictCatsEquality')、それは見えません。これはうまくいきますが、これは動作しますが、参照されているクラスは猫自身のために多く使用されているように見えるため、これは猫の将来の機能(Scalatestでこの動作をオーバーライドするための何らかの暗黙的/特質を提供する)です。 –