F-有界存在量化

时间:2016-07-11 11:22:39

标签: scala existential-type type-theory f-bounded-polymorphism

在尝试理解scala的类型系统时,我遇到了F-bounded类型的存在量化。

A成为一种类型

trait A[F <: A[F]] { self: F => }

其中FA的F-bounded自我类型。

B A的某些子类型

case class B() extends A[B]

如果我尝试使用存在量化来声明List A

val a: List[T] forSome { type T <: A[T] } 

分配a List B时出错。出于某种原因,scala推断出类型List[A[Nothing]]

val a: List[T] forSome { type T <: A[T] } = List(B()) // type mismatch

当应用简化规则4(如scala-spec中所述)时,T的协变出现可能被上限(此处为:A[T])取代

val b: List[A[T]] forSome { type T <: A[T] } = List(B())

两个例子都应该是等价的(如果我没有误解某些东西),但简化的例子就可以了。此外,以下内容也是正确的,应该是等效的:

val c: List[T forSome { type T <: A[T] }] = List(B())

但由于某种原因,c的类型和b的类型不相等。

所以我的问题是:这是scala编译器的错误还是我误解了一些关键的东西?

修改:我的假设是正确的,cb的类型不相等,因为c中的存在量化不会看到协变发生T

0 个答案:

没有答案
相关问题