2016-09-22 18 views
0

Scala의 실존 유형에 대해 drmacvier 블로그에 있습니다. 그것을 읽은 후에 나는 유형을 실험하고 있었고 rnduja 블로그에 주어진대로 다음과 같은 방식으로 유형의 평등을 검사하고 있습니다.T 유형의 일부 (유형 T)

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

제가 이해할 수 없었다하는 것은 T forSome{type T}는 모든 종류의 만족하지만 왜 그 형태 Any 임 : I 체크

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 

가장 먼저하는 일이이었다. 가정 할 때, 가능한 모든 유형의 공통 조상 인 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가 공변 (covariant)이고 배열이 불변 (invariant)이기 때문에? –

답변

1

는 T forSome {형 T}는 모든 종류의에 의해 만족된다 그런데 왜 그 형태가 어떤

모든 (되지 않은 타입)입니다 적어도 (일부 유형이 타입 Any). 따라서 일부 유형 T에 대해서는 T 유형이 있습니다. 그러나 이것은 또한 유형이 T forSome { type T }임을 의미합니다. 따라서 Any 유형의 값은 T forSome { type T } 유형 (및 그 반대)입니다. 처음 두 비교를 들어

: AB 동일한 경우, 다음 F[A]F가 무엇이든, F[B] 같아야한다. 방금 AnyT forSome {type T}이 같은지 확인 했으므로 ... 다른 두 가지 경우에 대해 동일한 추론을 사용할 수 없습니다. A, BF은 무엇이 될까요? 의 당신이 그 다음이 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]은 분명히 다릅니다. 하나의 값은 다른 유형을 가지지 않고 이러한 유형 중 하나를 가질 수 있습니다.