Again, T1.summon(v)
无法编译,因为T1.t1
不是候选者,手动解决T1.summon(v)(T1.t1)
不编译。
For T3
and T4
T3.t1[HNil, Base.ForH]
, T4.t1[HNil, Base.ForH]
将成为候选人
T3.summon(v)(T3.t1[HNil, Base.ForH]) // compiles
T4.summon(v)(T4.t1[HNil, Base.ForH]) // compiles
但问题是H
首先被推断并且被推断为Nothing
but t1[Nothing, Base.ForH]
不满足类型限制。
所以问题不在于隐式解析算法,没关系,问题在于类型推断(我们都知道它在 Scala 中相当弱)。
你可以预防H
推断得太快Nothing
如果你修改T3.t1
, T4.t1
object T3 extends TypeClasses {
implicit def t1[
H <: HList,
T <: Base/*.Lt[H]*/
](implicit ev: T <:< Base.Lt[H]): TypeClass[T] = new TypeClass[T] {
type HH = H
}
}
object T4 extends TypeClasses {
implicit def t1[
H <: HList,
T <: Base/*.Aux[H]*/
](implicit ev: T <:< Base.Aux[H]): TypeClass[T] = new TypeClass[T] {
type HH = H
}
}
T3.summon(v) // compiles
T4.summon(v) // compiles