抱歉没有描述性标题。类型级计算在互联网上并不是太常见的主题,无法建立精确的术语。
我尝试使用类型级计算,并且每次都会突然出现虚假错误。我无法理解为什么这么小的差异很重要。我设法打造了另一个简洁的例子:
trait Sample {
type X
type DX[I <: X] <: Nothing
type EX[I <: X] = Nothing
}
type Aux[I] = Sample {type X = I}
type U1 = Aux[Int]#DX[Int] // ok
type U2 = Aux[Int]#EX[Int] // fails
错误消息是:
error: type arguments [Int] do not conform to type EX's type parameter bounds [I <: Sample.this.X]
type U2 = Aux[Int]#EX[Int]
^
但是EX
和DX
具有相同的类型参数边界。为什么它在一个案例中是正确的而在另一个案例中是错的?