首页 > 解决方案 > 未定义的抽象类型成员和存在类型之间的区别

问题描述

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

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

标签: scalatypesequivalentexistential-typetype-alias

解决方案


你错过了括号:

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.


推荐阅读