2016-09-22 67 views
0

我正在通过drmacvier博客了解Scala中的存在类型。阅读完后,我正在试验类型,我正在按照以下方式检查类型的相等性,如rnduja博客中所述。T的类型forSome {type T}

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 

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

+0

大概是因为List是协变的而且数组是不变的? –

回答

1

什么我不明白为T forSome {类型T}是任何类型的满意,但为什么它的类型任何

任何(没有任何类型)有一些类型的(至少类型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]是不同的:一个值可以具有这些类型之一,而不具有其他类型。