Учитывая, что член неинициализированного абстрактного типа =:=
равен экзистенциальному типу
implicitly[Undefined =:= x forSome { type x }] // ok
, то почему кажется, что между ними есть разница в
object O {
type Undefined
implicitly[Undefined =:= _] // ok
def g[F[_]](fun: F[_] => F[_]) = ???
def h[F[_]](fun: F[Undefined] => F[Undefined]) = ???
g[List](l => List(42)) // ok
h[List](l => List(42)) // error
}
Обратите внимание, как g
компилируется, а h
вызывает ошибку несоответствия типа. Кроме того, рассмотрите
object O {
type Undefined
type Existential = x forSome { type x }
implicitly[Undefined =:= x forSome { type x }] // ok
implicitly[Undefined =:= Existential] // error
}
Если Undefined
равно x forSome { type x }
, а x forSome { type x }
равно Existential
, то почему Undefined
не равно Existential
?