Разница между неопределенным членом абстрактного типа и экзистенциальным типом - PullRequest
1 голос
/ 19 июня 2020

Учитывая, что член неинициализированного абстрактного типа =:= равен экзистенциальному типу

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?

1 Ответ

3 голосов
/ 19 июня 2020

Вы пропустили скобки:

implicitly[Undefined =:= (x forSome { type x })]

Значит, он не компилируется.

Между ними должна быть разница. Они разные.

implicitly[Undefined <:< (x forSome { type x })] 

, но не наоборот.

На самом деле x forSome { type x } просто Any.

Что означает implicitly[Undefined =:= _]?

implicitly[Undefined =:= _] это implicitly[(Undefined =:= x) forSome {type x}].

И Undefined =:= x верно для некоторых x. А именно для Undefined.

...