存在类型如何与路径相关类型重叠?

yrwegjxp  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(331)

启动scala3的存在类型已经被删除,原因之一是
存在类型在很大程度上与路径依赖类型重叠,因此拥有它们的好处相对较小。
考虑到“很大程度上”,所以并不总是这样,我想知道是否可以提供一个具体的例子来演示如何将一个存在类型重写为路径依赖类型,以及当这种替换不可能时的一个例子?

eqzww0vc

eqzww0vc1#

假设 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 以及 B 随身携带的信息大致相同,主要区别在于我们如何获取类型 T 我们正在量化。万一 b: B ,我们可以得到它作为路径依赖类型 p.T ,鉴于 a: A ,我们可以在模式匹配中使用类型变量。
下面的示例演示了如何在存在量化类型和路径相关类型之间进行Map:

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中的每一个存在类型都可以由路径依赖类型精确表示,因为这样的说法无论如何都不可能严谨。

相关问题