是我们存在的类型。 提供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
}
1条答案
按热度按时间eqzww0vc1#
假设
T
是我们想要用存在量词绑定的类型F[T]
是一种依赖于T
,所以是我们存在的类型。
提供a类示例意味着:
存在某种类型的
t
它可以被T
存在类型为的值F[t]
但我们也可以把这两个组件放到一个类型中,然后T
路径相关类型成员:类型的示例
B
由相同的数据描述:某种类型
t
可以由名称绑定的T
.类型的值
F[t]
两者的价值观A
以及B
随身携带的信息大致相同,主要区别在于我们如何获取类型T
我们正在量化。万一b: B
,我们可以得到它作为路径依赖类型p.T
,鉴于a: A
,我们可以在模式匹配中使用类型变量。下面的示例演示了如何在存在量化类型和路径相关类型之间进行Map:
(编译时间:2.13)
我猜“很大程度上”是存在的,因为与scala 3/dotty不同,scala的早期版本没有任何严格形式化的基础,所以这句话的作者可能只是不想唤起这样一种印象,即2.13中的每一个存在类型都可以由路径依赖类型精确表示,因为这样的说法无论如何都不可能严谨。