Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
A#B在scala中是什么意思_Scala - Fatal编程技术网

A#B在scala中是什么意思

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

我正在努力理解下面的代码。但我不知道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]
}
//定义抽象类型和边界
特征重现{

键入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)。如果你想深入挖掘,它被称为“类型投影”。谢谢你的信息。