4

我正在尝试理解以下代码。但我不知道 R#X 是什么意思。有人可以帮助我吗?

 // define the abstract types and bounds
 trait Recurse {
    type Next <: Recurse
// this is the recursive function definition
    type X[R <: Recurse] <: Int
 }
// implementation
 trait RecurseA extends Recurse {
    type Next = RecurseA
  // this is the implementation
    type X[R <: Recurse] = R#X[R#Next]
 }
object Recurse {
  // infinite loop
  type C = RecurseA#X[RecurseA]
}
4

1 回答 1

6

您可以从现有的类实例中获取类型:

class C {
  type someType = Int
}
val c = new C
type t = c.someType

或者可以直接寻址类型而不实例化对象:C#someType这种形式对于没有空间创建中间变量的类型表达式非常有用。


按照评论中的建议添加一些说明。

免责声明:我对 Scala 的类型系统的工作原理只有部分了解。我曾多次尝试阅读文档,但只能从中提取不完整的知识。但我在 scala 方面有丰富的经验,并且可以很好地预测编译器在个别情况下的行为。

#称为类型投影.和类型投影通过在每个类型表达式中,scala 都隐含地使用了这两者来补充正常的分层类型访问。

scala 参考给出了这种无形转换的例子:

t                        ə.type#t
Int                      scala.type#Int
scala.Int                scala.type#Int
data.maintable.Node      data.maintable.type#Node

正如使用所见,类型投影的每一个微不足道的用法实际上都适用于类型(即 return with .type)而不是对象。主要的实际区别(我对定义不好)是对象类型是短暂的,就像对象本身一样。它的类型可以在适当的情况下更改,例如抽象类类型的继承。相比之下类型的类型(类型投影的定义)和太阳一样稳定。scala 中的类型(不要与类混合)不是一等公民,不能进一步覆盖。

有不同的地方适合放入类型表达式。还有一些地方只允许使用稳定类型。所以基本上类型投影对于类型而言更加恒定。

于 2013-07-29T03:06:53.890 回答