2016-09-22 13 views
0

私はdrmacvierのScalaの存在型についてのブログを行っています。それを読んだ後、私はタイプを試していました。rndujaブログで与えられているように、次のようにタイプの平等をチェックしています。T型の種類{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 

私がチェックした最初の事は、このでした:私は理解できませんでしたがT forSome{type T}ある

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

任意のタイプによって満たさが、なぜそのタイプ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

おそらくリストは共変であり、配列は不変であるからでしょうか? –

答えて

1

はT forSome {型T}は、任意のタイプによって満たされるが、なぜ、その種類は任意

任意(ない任意の型)であり、少なくとも(いくつかのタイプを有しますタイプAny)。したがって、タイプTの場合はタイプTとなります。しかし、これはタイプがT forSome { type T }であることを意味します。したがって、タイプAnyの値はすべてタイプT forSome { type T }(またはその逆)です。最初の2つの比較について

ABに等しい場合、F[A]Fが何であれ、F[B]に等しくなければなりません。あなたはちょうどAnyT forSome {type T}が等しいとチェックしました...しかし、他の2つのケースで同じ推論を使うことはできません:ABFは何ですか?あなたはそれがArray[T] forSome { type T }を入力してい

val array: Array[String] = Array("a") 

値としましょうので

Array[Any]

は、 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]は異なっています。値は、これらのタイプのうちの1つを他のタイプを持たずに持つことができます。

関連する問題