2012-05-11 48 views
7

我正在读深入Scala。这是本书的摘录:路径依赖类型是否是类型投影?

所有路径相关类型都是类型投影。通过编译器将路径依赖类型foo.Bar重写为 为foo.type#Bar ...

在Scala中,所有类型引用都可以写成针对命名实体的项目。类型scala.String是scala.type#String的简写,其中名称scala指的是包scala,类型String由scala包中的String类定义。

显然,没有scala.String类,但我失败Null重现此。

scala> type N = scala.type#Null 
<console>:7: error: type mismatch; 
found : type 
required: AnyRef 
     type N = scala.type#Null 

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

回答

8

下面是这证实了乔希写了一个快速REPL会话,

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

scala> val foo = new Foo 
foo: Foo = [email protected] 

scala> implicitly[foo.type#T =:= foo.T] 
res0: =:=[foo.T,foo.T] = <function1> 

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

+0

但根据SLS§3.1'路径是以下... p.x其中p是一个路径,并且x是p的稳定构件中的一个。稳定构件是 包或...一个稳定identi音响ER处于identi音响er.''scala.Null'是稳定的标识符结束的路径。对? – 4e6

+0

不,所有稳定的标识符都是值或包:'scala.Null'指定的类型不是值。 'scala'是一个稳定的标识符,但是,当你观察到的,是一个包,而不是一个对象,其行为WRT的单型运营商形成'.type'是foo'我在我的答案给的例子'不同。 –

+0

哦,现在,我终于明白了'.type'行为。花了很多时间来理解它。非常感谢你:) – 4e6