gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:47:12 24 4
gpt4 key购买 nike

启动 Scala 3 存在类型是 dropped原因之一是

Existential types largely overlap with path-dependent types, so thegain of having them is relatively minor.


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

最佳答案

假设 T是我们想要通过存在量词绑定(bind)的类型,而 F[T]是某种依赖于 T 的类型, 以便

type A = F[T] forSome { type T }
是我们的存在类型。
提供类型 A 的实例意味着:
  • 存在某种类型 t可以被 T 绑定(bind)
  • 存在类型为 F[t] 的值

  • 但是我们也可以将两个组件放在一个类型中,然后使 T路径依赖类型成员:
    type B = { type T; val value: F[T] }
    B 类型的实例由相同的数据描述:
  • 某型 t可以被名称绑定(bind)的T .
  • 类型为 F[t] 的值

  • 两者的值 AB携带大致相同的信息,主要区别在于我们如何访问类型 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 可以由路径依赖类型精确表示,因为这样的声明无论如何都不能严格。

    关于scala - 存在类型如何与路径依赖类型重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67148882/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com