类型T forSome {type T}

时间:2016-09-22 16:48:30

标签: scala type-systems existential-type

我正在浏览有关Scala中存在类型的drmacvier博客。阅读之后我正在尝试使用类型,我正按照rnduja博客中给出的方式检查类型是否相等。

def implicitly[A](implicit a: A) = a

// To check equality of two types
class =:=[A, B]
implicit def equalTypeInstance[A] = new =:=[A, A]
def type_==[A, B](implicit ev: A =:= B = null) = ev != null

// To check subtype relation between two types
class <:<[-A, +B]
implicit def subTypeInstance[A] = new <:<[A, A]
def type_<[A, B](implicit ev: A <:< B = null) = ev != null

我检查的第一件事是:

type_==[Any, T forSome{type T}] // true

我无法理解的是T forSome{type T}对任何类型都满意,但为什么它的类型为Any。假设,由于Any是所有可能类型的共同祖先,因此它们是相等的。以类似的方式我能够推理。

type_==[Array[Any], Array[T forSome{type T}]] // true
type_==[List[Any], List[T forSome{type T}]] // true

我无法用同样的理由做到这一点。

type_==[Array[Any], (Array[T] forSome{type T})] // false
type_==[List[Any], (List[T] forSome{type T})] // true

我在这里想念的是什么?我的推理方式有缺陷吗?

1 个答案:

答案 0 :(得分:1)

  

我无法理解的是T forSome {type T}对任何类型都满意,但为什么它的类型为Any

任何(不是任何类型)都有某种类型(至少类型Any)。因此,某些类型T的类型为T。但这意味着它也有类型T forSome { type T }。因此,Any类型的任何值都具有类型T forSome { type T }(反之亦然)。

对于前两个比较:如果A等于B,那么F[A]应该等于F[B],无论F是什么。您刚刚检查过AnyT forSome {type T}是否相等,所以...但是您根本无法对其他两种情况使用相同的推理:{{1} },AB是?

FArray[Any]不同,因为我们假设您有值

Array[T] forSome { type T }

然后它有val array: Array[String] = Array("a") 类型(你明白为什么吗?):

Array[T] forSome { type T }

val arrayForSome: Array[T] forSome { type T } = array // compiles

没有编译(因为val arrayOfAny: Array[Any] = array 是不变的)。很明显ArrayArray[T] forSome { type T }是不同的:一个值可以有这些类型中的一个而没有另一个。