Some 的 T 类型{type T}

Type of T forSome{type T}

我正在浏览 drmacvier blog about existential types in Scala. After reading it I was experimenting with types and I am checking the equality of types in the following manner as given in 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

我在这里错过了什么?我的推理方式有问题吗?

what I could not understand is T forSome{type T} is satisfied by any type but why is its type Any

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

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

Array[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

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