我有一个 typeclass ,如果我们有一个或一个实例Search
,它就有一个实例。优先考虑实例。Search[A]
TypeClass1[A]
TypeClass2[A]
1
以下编译:
trait TypeClass1[A]
trait TypeClass2[A]
trait Search[A]
object Search extends LPSearch {
implicit def case1[A](implicit ev: TypeClass1[A]): Search[A] = null
}
trait LPSearch {
implicit def case2[A](implicit ev: TypeClass2[A]): Search[A] = null
}
object Test {
implicit val ev1: TypeClass1[Int] = null
implicit val ev2: TypeClass2[Int] = null
implicitly[Search[Int]]
}
正如我所期望的那样,隐式搜索 finds case1
, findsev1
并停止搜索。
但是,如果我们更改TypeClass2
为具有更多结构,则隐式搜索将停止工作:
trait TypeClass1[A]
trait TypeClass2[M[_], A]
trait Search[A]
object Search extends LPSearch {
// This is the same as before
implicit def case1[A](implicit ev: TypeClass1[A]): Search[A] = null
}
trait LPSearch {
implicit def case2[M[_], A](implicit ev: TypeClass2[M, A]): Search[M[A]] = null
}
object Test {
implicit val ev1: TypeClass1[List[Int]] = null
implicit val ev2: TypeClass2[List, Int] = null
// Does not compile:
implicitly[Search[List[Int]]]
}
为什么在上面的例子中最后一行没有编译?
它失败了ambiguous implicit values
,说两者case1
并case2
满足条件。
在 scala 2.12.8 和 2.13.0 上观察到的行为