类型错误是因为外观相同的类型成员在某种程度上有所不同?

Type error because identical looking type members are somehow different?

这是我正在为我的库编写的一些代码的高度简化版本,我收到了一个我不理解的类型错误。我的 class 库支持 "map" 函数,它使用的构建器类似于 Scala 自己的集合库使用构建器的方式(为了简单起见,我在这里从我的示例中删除了构建器,因为它没有必要重现错误)。

class MultiSignal[T] {
  def map[U, R[_] <: MultiSignal[_]](f : T => U) : R[U] =
    throw new Exception()  //not implemented in this version
}

class OrderedMultiSignal[T] extends MultiSignal[T] {
  type Position
}

object orderedMultiSignal extends OrderedMultiSignal[Int] {
  type Position = Int
}

object MyApp {
  //type error on next line
  val mappedSignal : OrderedMultiSignal[String] { type Position = Int } = orderedMultiSignal.map[String, OrderedMultiSignal { type Position = Int }](_.toString)
} 

当我使用 -uniqid 参数编译此代码时,出现此错误:

Resource    Description Path    Location    Type
SameType.scala  type mismatch;
  found   : OrderedMultiSignal#7774[String#7331]{type Position#25375 = Int#1076}
  required: OrderedMultiSignal#7774[String#7331]{type Position#25335 = Int#1076}

如您所见,除了 Position 类型成员以某种方式被视为不同之外,这些类型是相同的,即使它们具有相同的名称和相同的值。怎么会这样?我可以修改指定 OrderedMultiSignal { type Position = Int } 类型参数的方式来解决这个问题吗?

更新

在进行了更多试验之后,我想到尝试使用类型 lambda 表达式,并且成功了。在出现类型错误的行中,将 OrderedMultiSignal { type Position = Int } 替换为 ({type λ[α] = OrderedMultiSignal[α] { type Position = Int }})#λ 即可。不过,我仍然想了解为什么我的原始语法不起作用。

OrderedMultiSignal 更高类型没有 Position 类型成员,因为它不是 OrderedMultiSignal[something] 的子类型。因此,当您编写 OrderedMultiSignal { type Position = Int } 时,您通过添加一个 new 类型成员(也称为 Position 但与 [=16 中的成员无关)来优化 OrderedMultiSignal =].

或者换句话说,OrderedMultiSignal { type Position = Int } 等同于 ({type λ[α] = OrderedMultiSignal[α]})#λ { type Position = Int } 而不是您最终得到的类型。