存在类型如何与路径依赖类型重叠?

2023-12-20

起始 Scala 3 存在类型已dropped http://dotty.epfl.ch/docs/reference/dropped-features/existential-types.html原因之一如下:

存在类型在很大程度上与路径依赖类型重叠,因此 拥有它们的收益相对较小。

鉴于“很大程度上”,所以并不总是,我想知道是否可以提供一个具体的示例来演示如何将存在类型重写为路径依赖类型,以及无法进行此类替换的示例?


假设T是我们想要通过存在量词绑定的类型,并且F[T]是某种类型,取决于T, 以便

type A = F[T] forSome { type T }

是我们的存在类型。

提供类型 A 的实例意味着:

  • 存在某种类型t可以被约束T
  • 存在一个类型的值F[t]

但我们也可以将这两个组件放入一个类型中,然后使T路径相关类型成员:

type B = { type T; val value: F[T] }

类型实例B由相同的数据描述:

  • 某种类型t可以通过名称绑定T.
  • 类型的值F[t]

两者的价值观A and B携带大致相同的信息,主要区别在于我们如何访问类型T我们正在对其进行量化。的情况下b: B,我们可以得到它作为路径依赖类型p.T,而对于a: A,我们可以在模式匹配中使用类型变量。

这是一个示例,演示了如何在存在量化类型和路径依赖类型之间进行映射:

def example[F[_]]: Unit = {
  type A = F[T] forSome { type T }
  type B = { type T; val value: F[T] }
  def ex2pd(a: A): B = a match {
    case v: F[t] => new { type T = t; val value = v }
  }
  def pd2ex(b: B): A = b.value
}

(这在 2.13 上编译)

我猜想“很大程度上”是存在的,因为与 Scala 3 / Dotty 不同,Scala 的早期版本没有任何严格形式化的基础,所以也许这句话的作者只是不想唤起这样的印象:每个存在类型都来自2.13 可以由路径相关类型精确表示,因为这样的声明无论如何都无法严格执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

存在类型如何与路径依赖类型重叠? 的相关文章

随机推荐