未定义的抽象类型成员和存在类型之间的区别

Difference between an undefined abstract type member and an existential type

给定一个未初始化的抽象类型成员=:=等于一个存在类型

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

你漏掉了括号:

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

所以编译不了。

它们之间应该是有区别的。他们是不同的。

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

反之则不然。

实际上 x forSome { type x } 只是 Any.

What is the meaning of implicitly[Undefined =:= _]?

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

并且 Undefined =:= x 对于某些 x 是正确的。即对于Undefined.