Ошибка в 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
}
}
Есть несколько способов сделать изменение ошибки или уйти:
Если мы удалим параметр V по признаку A (и классу case B), часть ошибки "GADT-skolem" исчезнет, но элемент "конструктор не может быть экземпляр" остается.
Если мы переместим параметр U класса Test в метод 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
}
}
}
Упрощенный, похоже, что это больше похоже на ошибку или ограничение компилятора. Или я что-то упускаю?