类型错误是因为外观相同的类型成员在某种程度上有所不同?
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 }
而不是您最终得到的类型。
这是我正在为我的库编写的一些代码的高度简化版本,我收到了一个我不理解的类型错误。我的 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 }
而不是您最终得到的类型。