Scala:路径相关类型的类型类实例的隐式查找

Scala:路径相关类型的类型类实例的隐式查找,scala,implicit,path-dependent-type,Scala,Implicit,Path Dependent Type,调用api.doSomething无法编译: trait Encoder[From, To] { def encode(x: From): To } object Encoder { implicit val thingToString: Encoder[Thing, String] = new Encoder[Thing, String] { def encode(x: Thing): String = x.toString } } trait Config { ty

调用
api.doSomething
无法编译:

trait Encoder[From, To] {
  def encode(x: From): To
}
object Encoder {
  implicit val thingToString: Encoder[Thing, String] = new Encoder[Thing, String] {
    def encode(x: Thing): String = x.toString
  }
}

trait Config {
  type Repr
}
class MyConfig extends Config { type Repr = String }
//class ConcreteConfig { type Repr = String }

class Api[T](val config: Config) {
  def doSomething(value: T)(implicit encoder: Encoder[T, config.Repr]): Unit = {}
}

case class Thing(a: Int)

object Test extends App {
  import Encoder._

  val api = new Api[Thing](new MyConfig)
  api.doSomething(Thing(42))
}
如果我更改
类Api[T]
的构造函数的签名,使其采用
ConcreteConfig
,那么编译器可以判断
config.Repr==String
,隐式查找成功。但对于我的用例来说,这真的不起作用

有没有其他方法来指导隐式查找?我丢失类型信息是因为我缺少类型细化还是什么?

这无法实现,因为config.Repr不是一个稳定的路径。编译器无法确定config.Repr=String,即使config的运行时值是MyConfig类型

只有当您可以在Api中提供具体的配置实例作为类型参数时,这才会起作用,它将告诉编译器Repr的确切类型:


class-Api[T,C一步一步地推断类型。而且,我看不出有任何理由在这里使用值相关类型(或者,就这一点而言,在任何地方;这是一个不同的问题)

trait编码器[从,到]{
def编码(x:From):至
}
对象编码器{
隐式val thingToString:Encoder[Thing,String]=新编码器[Thing,String]{
def encode(x:Thing):String=x.toString
}
}
特征配置{
类型报告
}
类MyConfig扩展配置{type Repr=String}
//类ConcreteConfig{type Repr=String}
case类Api[T,C
Api.config.Repr
是一条稳定的路径,尽管您的第二句话是正确的。
could not find implicit value for parameter encoder: Encoder[Thing,Test.api.config.Repr]