在scala中,如何使类型类为Aux模式工作第二部分

在scala中,如何使类型类为Aux模式工作第二部分,scala,typeclass,abstract-data-type,type-alias,scala-2.13,Scala,Typeclass,Abstract Data Type,Type Alias,Scala 2.13,这是以下问题的后续问题: 考虑以下例子: 特征库{ 打字 def v:退出 } 对象库{ 类型Aux[T]=Base{type Out=T} 再次输入Lt[T]=Base{type Out,T1.callo(v)不编译,因为T1.T1不是候选项,手动解析T1.callo(v)(T1.T1)不编译 对于T3和T4T3.t1[HNil,Base.ForH],T4.t1[HNil,Base.ForH]将是候选人 T3.summon(v)(T3.t1[HNil, Base.ForH]) // compi

这是以下问题的后续问题:

考虑以下例子:

特征库{
打字
def v:退出
}
对象库{
类型Aux[T]=Base{type Out=T}
再次输入Lt[T]=Base{type Out,
T1.callo(v)
不编译,因为
T1.T1
不是候选项,手动解析
T1.callo(v)(T1.T1)
不编译

对于
T3
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
,但是
t1[Nothing,Base.ForH]
不满足类型界限

所以问题不在于隐式解析算法,而是类型推断(我们所知道的是,它在Scala中非常弱)

如果修改
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
对象T3扩展类型类{
隐式deft1[

H仅供参考,T3和T4在Scala 3(
3.0.0-M3
)中运行良好因此,这可能只是Scala 2的一个缺陷/限制。哇……我以为T3不应该工作。那里发生了什么:-如果隐式参数或隐式的返回类型中没有使用
H
,那么编译器就没有什么可以继续推断
H
@Jasper-M(叹气)你可能是对的,我浏览了整个shapeless的源代码,到目前为止只在隐式中找到了Auxparameters@DanSimon,我会试着详细说明:因为