Этот ответ https://stackoverflow.com/a/56366311/2682459 показывает, как можно использовать объект для обеспечения пользовательской реализации класса типов при использовании Kitten.Применение того же принципа к следующему коду, хотя и не работает:
package com.xxx.yyy.zzz
import cats._, cats.derived._, cats.implicits._
object Test extends App {
case class Inner(double: Double)
case class Outer(inner: Inner, s: String)
implicit object doubleEq extends Eq[Double] {
override def eqv(x: Double, y: Double): Boolean = Math.abs(x - y) < 0.1
}
implicit val outerEq: Eq[Outer] = {
import derived.auto.eq._
derived.semi.eq[Outer]
}
implicitly[Eq[Double]]
val testCC1 = Outer(Inner(1.01d), "BlahBlahBlah")
val testCC2 = Outer(Inner(1.00d), "BlahBlahBlah")
println(testCC1 === testCC2)
}
implicitly[Eq[Double]]
показывает, что я снова имею неоднозначные последствия:
Error:(20, 13) ambiguous implicit values:
both value catsKernelStdOrderForDouble in trait DoubleInstances of type => cats.kernel.Order[Double] with cats.kernel.Hash[Double]
and object doubleEq in object Test of type com.xxx.yyy.zzz.Test.doubleEq.type
match expected type cats.Eq[Double]
implicitly[Eq[Double]]
Как мне работатьэтот?Я действительно не хочу, чтобы вишня выбрала следы кошек, которые я импортирую, поскольку это не очень масштабируемо!