scala 类型系统中的核心演算(递归)

发布于 2024-10-18 04:40:56 字数 279 浏览 2 评论 0原文

scala编译器中的Typer如何验证以下内容:

class D[T <: D[T]]
class E extends D[E]

类D的类型参数的上限D[T]必须与E兼容。类型E不等于D,因此将检查其基类型D。由于 E 的基类型和 D 的类型构造函数相等,因此必须检查边界。递归来了。 核心微积分不处理这个问题。

How does the Typer in the scala compiler verify the following:

class D[T <: D[T]]
class E extends D[E]

The upper bound D[T] of class D's type parameter must be compatible with E. Type E is not equivalent to D, so its base type D will be checked. Because the type constructors of E's base type and D are equal, the bounds must be checked. And here comes the recursion.
The Core Calculus does not handle this.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

预谋 2024-10-25 04:40:56

1) 从

E extends D[E]

2) 开始意味着 Scala 中的子类型化,因此

E <: D[E]        

3) 由于定义“class D[T <: D[T]]”,任何 D[T] 对 T 的要求是 T <: D[T]。步骤 2 表示 E 必须能够插入 T,因此它更好地符合该要求。用 E 代替 T,我们得到这样的要求:

E <: D[E]

我们已经在步骤 2 中显示了 E <: D[E]。我们就完成了。

1) Start with

E extends D[E]

2) Extends implies subtyping in Scala, so

E <: D[E]        

3) Because of the definition "class D[T <: D[T]]", the requirement on T for any D[T] is that T <: D[T]. Step 2 said E must be able to be able to be plugged in to T, so it better match that requirement. Substituting E for T we get the requirement that

E <: D[E]

We already showed E <: D[E] in step 2. We're done.

孤独患者 2024-10-25 04:40:56

没有真正的答案,只有两点评论:这种模式被称为 CRTP,它适用于 Java,也是(参见java.lang.Enum

No real answer, just two remarks: This pattern is known as CRTP, and it works in Java, too (see java.lang.Enum)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文