类型级编程中的协变性 [英] Covariance in type-level programming
问题描述
我试图创建与Scala库中的元组相同的类型Tuple,仅使用:+方法通过添加第N + 1个值将Tuple扩展为Tuple,以便我能够递归地构造元组: 这个编译,但只要我取消注释的定义 这是为什么?你能提供一种解决方法,它允许我递归地构建Tuples(混合的,类型安全的值类型)吗? 谢谢。 您可以在 up
pre $ class Test {
abstract class Tuple {
// protected type Next [_] ] <:Tuple
// def:+ [T](p:T):Next [T]
}
case class Tuple0()extends Tuple {
protected type Next [T] = Tuple1 [T]
def:+ [T](p:T):Next [T] = Tuple1(p)
}
case class Tuple1 [+ T1](p1:T1)extends Tuple {
protected type Next [T] = Tuple2 [T1,T]
def:+ [T](p:T):Next [T] = Tuple2(p1,p)
}
案例类Tuple2 [+ T1,+ T2](p1:T1,p2:T2)扩展Tuple {
保护键入Next [-T] = Nothing
def:+ [T](p:T):Next [T] =抛出新的IndexOutOfBoundsException();
Test.scala:13:error:协变类型T1出现在类型[ T] Test.this.Tuple2 [T1,T]类型Next
保护类型Next [T] = Tuple2 [T1,T]
^
找到一个错误