Рассмотрим следующую настройку:
trait Foo[A]
object Foo extends Priority2
trait Priority0 {
implicit def foo1: Foo[Int] = new Foo[Int] {}
}
trait Priority1 extends Priority0 {
implicit def foo2: Foo[Boolean] = new Foo[Boolean] {}
}
trait Priority2 extends Priority1 {
implicit def foo3: Foo[Double] = new Foo[Double] {}
}
Теперь, в REPL (загрузив код выше), я могу сделать следующее:
scala> def implicitlyFoo[A](implicit foo: Foo[A]) = foo
implicitlyFoo: [A](implicit foo: Foo[A])Foo[A]
scala> implicitlyFoo
res1: Foo[Double] = Priority2$$anon$3@79703b86
Есть ли способ кодировать с помощью некоторой магии уровня типа, которую я хочу пропустить через экземпляры с помощью A =:= Double
, но все же позволить выводу типа выяснить, что такое A
?
Я не хочу, чтобы тень foo3
. Это MVCE: в моем реальном случае foo3
- это def
с другими неявными аргументами (и может играть косвенную роль в получении других Foo
).
Я пробовал =:!=
из бесформенного, но безрезультатно:
scala> import shapeless._
import shapeless._
scala> def implicitlyFoo2[A](implicit foo: Foo[A], ev: A =:!= Double) = foo
implicitlyFoo2: [A](implicit foo: Foo[A], implicit ev: A =:!= Double)Foo[A]
scala> implicitlyFoo2
<console>:16: error: ambiguous implicit values:
both method neqAmbig1 in package shapeless of type [A]=> A =:!= A
and method neqAmbig2 in package shapeless of type [A]=> A =:!= A
match expected type Double =:!= Double
implicitlyFoo2
^