在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,我会试着详细说明:因为