scala 类型系统中的核心演算(递归)
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
1) 从
2) 开始意味着 Scala 中的子类型化,因此
3) 由于定义“class D[T <: D[T]]”,任何 D[T] 对 T 的要求是 T <: D[T]。步骤 2 表示 E 必须能够插入 T,因此它更好地符合该要求。用 E 代替 T,我们得到这样的要求:
我们已经在步骤 2 中显示了 E <: D[E]。我们就完成了。
1) Start with
2) Extends implies subtyping in Scala, so
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
We already showed E <: D[E] in step 2. We're done.
没有真正的答案,只有两点评论:这种模式被称为 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
)