Test.test 中的错误似乎不合理:
sealed trait A[-K, +V]
case class B[+V]() extends A[Option[Unit], V]
case class Test[U]() {
def test[V](t: A[Option[U], V]) = t match {
case B() => null // constructor cannot be instantiated to expected type; found : B[V] required: A[Option[U],?V1] where type ?V1 <: V (this is a GADT skolem)
}
def test2[V](t: A[Option[U], V]) = Test2.test2(t)
}
object Test2 {
def test2[U, V](t: A[Option[U], V]) = t match {
case B() => null // This works
}
}
有几种方法可以使错误更改或消失:
如果我们删除特征 A(和案例类 B)上的 V 参数,错误的“GADT-skolem”部分就会消失,但“构造函数无法实例化”部分仍然存在。
如果我们将 Test 类的 U 参数移到 Test.test 方法中,错误就会消失。为什么 ?(同样,Test2.test2 中不存在该错误)
以下链接也确定了该问题,但我不理解提供的解释。http://lambdalog.seanseefried.com/tags/GADTs.html
这是编译器中的错误吗?(2.10.2-RC2)
感谢您为澄清这一点提供的任何帮助。
2014/08/05:我设法进一步简化了代码,并提供了另一个示例,其中 U 绑定在立即函数之外而不会导致编译错误。我仍然在 2.11.2 中观察到这个错误。
sealed trait A[U]
case class B() extends A[Unit]
case class Test[U]() {
def test(t: A[U]) = t match {
case B() => ??? // constructor cannot be instantiated to expected type; found : B required: A[U]
}
}
object Test2 {
def test2[U](t: A[U]) = t match {
case B() => ??? // This works
}
def test3[U] = {
def test(t: A[U]) = t match {
case B() => ??? // This works
}
}
}
像这样简化,这看起来更像是编译器错误或限制。还是我错过了什么?