【问题标题】:Difference between an undefined abstract type member and an existential type未定义的抽象类型成员和存在类型之间的区别
【发布时间】:2020-06-19 17:29:22
【问题描述】:

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

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

【问题讨论】:

  • @DmytroMitin implicitly[Undefined =:= _]是什么意思?

标签: scala types equivalent existential-type type-alias


【解决方案1】:

你错过了括号:

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}]

对于某些xUndefined =:= x 是正确的。即为Undefined

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 2013-05-19
    • 2016-02-14
    • 1970-01-01
    • 2015-11-03
    相关资源
    最近更新 更多