路径依赖类型是否类型预测?

4e6*_*4e6 8 types scala projection path-dependent-type

我现在正在深入阅读Scala.以下是本书的摘录:

所有与路径相关的类型都是类型投影.路径依赖类型由编译器foo.Bar重写foo.type#Bar...

在Scala中,所有类型引用都可以编写为针对命名实体的项目.scala.String类型是scala.type#String名称scala引用包的位置的简写,scala类型StringStringscala包上的类定义.

显然,没有scala.String课,但我没有重现这一点Null.

scala> type N = scala.type#Null
<console>:7: error: type mismatch;
 found   : type
 required: AnyRef
       type N = scala.type#Null
Run Code Online (Sandbox Code Playgroud)

所以,我的问题如下.路径依赖类型是否类型预测?它只是内部编译器表示还是可以用scala代码表示?

Mil*_*bin 10

这是一个快速的REPL会话,它确认了Josh所写的内容,

scala> class Foo { type T = String }
defined class Foo

scala> val foo = new Foo
foo: Foo = Foo@10babe8

scala> implicitly[foo.type#T =:= foo.T]
res0: =:=[foo.T,foo.T] = <function1>
Run Code Online (Sandbox Code Playgroud)

您的scala.type#Null示例的问题是前缀scala是包前缀而不是值的稳定标识符.可以说它应该是后者,但不幸的是它不是......这是Scala包和Scala对象(在模块意义上)语义之间的一种挥之不去的不匹配.