gpt4 book ai didi

scala - Scala中的A#B是什么意思

转载 作者:行者123 更新时间:2023-12-05 00:28:59 27 4
gpt4 key购买 nike

我试图理解下面的一段代码。但我不知道 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]
}

最佳答案

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

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

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

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

关于scala - Scala中的A#B是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17915439/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com