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
是什么。您刚刚检查了 Any
和 T forSome {type T}
是否相等,所以...但是您不能对其他两种情况使用相同的推理:A
、B
和F
是吗?
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]
是不同的:一个值可以有其中一种类型而没有另一种。
我正在浏览 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
是什么。您刚刚检查了 Any
和 T forSome {type T}
是否相等,所以...但是您不能对其他两种情况使用相同的推理:A
、B
和F
是吗?
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]
是不同的:一个值可以有其中一种类型而没有另一种。