A#B在scala中是什么意思
我正在努力理解下面的代码。但我不知道R#X是什么意思。有人能帮我吗A#B在scala中是什么意思,scala,Scala,我正在努力理解下面的代码。但我不知道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 Re
// 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]
}
//定义抽象类型和边界
特征重现{
键入Next您可以从类的现有实例获得类型:
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
正如use-see所示,类型投影的每一个微不足道的用法实际上都适用于类型(即使用.type
返回),而不是对象对象类型和对象本身一样是短暂的。它的类型可以在适当的情况下更改,例如继承抽象类类型。相反,类型的类型(类型投影的定义)与sun一样稳定。类型(不要将它们与类混合)在斯卡拉,他们不是一等公民,不能被进一步推翻
有不同的地方适合将类型表达式放入。也有一些地方只允许使用稳定类型。因此,基本上类型投影对于类型而言更为恒定。您可能需要补充一点,即它被称为“类型投影”。请更新您的答案。您将其设置为C#someType
和C.someType
是相同的类型,但实际上不是。例如,如果您将someType
抽象化,以下内容将无法编译:隐式[C.someType=:=C#comeType]
c.someType
表示路径依赖类型,而c#someType
是类型投影。简而言之,R#X表示“一些R的X”(与特定的R的X相反,例如r1.X)。如果你想深入挖掘,它被称为“类型投影”。谢谢你的信息。