在 Scala 中的类型别名中为类型成员建立边界

Establish bounds for type members within a type alias in Scala

鉴于:

trait Record {
  type ID
  val id: ID
}

trait DataSource {
  type ID
  def read(id: ID): Try[R]
}

我希望能够笼统地描述 read 函数。

type Reader[R <: Record, DS <: DataSource] = (DS#ID) => Try[R]

我如何保证这里的类型安全,使得 DS#ID 不会是与 R#ID 不同的类型? 我试过了...

type Reader[R <: Record, DS <: DataSource, R#ID <: DS#ID] = (DS#ID) => Try[R]

但是那不能编译。这种情况的正确语法是什么?

在处理Reader的类型参数时,ID必须作为自己的参数被拉出来。

type Reader[R <: Record, DS <: DataSource, ID] = (ID) => Try[R]

一旦完成,就可以在其上放置额外的边界...

type Reader[R <: Record, DS <: DataSource, ID <: DS#ID =:= R#ID] = (ID) => Try[R]