如何帮助Scala 3编译器完成路径依赖类型(path-dependent-type)的推断
问题根因
编译器无法自动将具体Feature子类的路径依赖类型Precision和实际的精度类型(比如Temperature对应的Double)关联,它只会将Temperature#Precision识别为和实例绑定的抽象类型,因此无法匹配传入的7.0参数类型。
解决方案:适配Aux模式
你只需要做两处小修改,不需要把精度参数作为泛型到处传递:
- 给
Feature定义Aux类型别名,把类型成员Precision暴露为可推演的类型参数
trait Feature[A: Imprecise]: type Observation = A val imprecise = summon[Imprecise[A]] type Precision = imprecise.Precision def within(bound: Precision) = new RequiredFeature(this, bound) // 新增Feature伴生对象,定义Aux类型 object Feature: type Aux[A, P] = Feature[A] { type Precision = P }
- 定义具体
Feature子类时,明确声明Precision的实际类型,给编译器提供类型绑定证据
case class Temperature(chamber_id: Int) extends Feature[Bounds[Double]]: override type Precision = Double case class Pressure(chamber_id: Int) extends Feature[Bounds[Float]]: override type Precision = Float
修改完成后,val rf = Temperature(3).within(7.0)就可以正常编译。
可选优化:完善RequiredFeature类型安全
你原来的RequiredFeature定义用了通配符,后续拿min_precision时编译器无法识别其实际类型,你可以用Aux类型做下调整,编译器会自动推演精度类型,不需要你手动传泛型参数:
// 调整前 // class RequiredFeature(val feature: Feature[_], val min_precision: feature.Precision) // 调整后 class RequiredFeature[P](val feature: Feature.Aux[_, P], val min_precision: P)
内容的提问来源于stack exchange,提问作者mac01021
相关产品推荐
相关产品推荐

