Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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
Scala 路径依赖类型是否为投影类型?_Scala_Types_Projection_Path Dependent Type - Fatal编程技术网

Scala 路径依赖类型是否为投影类型?

Scala 路径依赖类型是否为投影类型?,scala,types,projection,path-dependent-type,Scala,Types,Projection,Path Dependent Type,我现在正在深入阅读Scala。以下是这本书的摘录: 所有路径相关类型都是类型投影。重写路径相关类型foo.Bar 作为编译器的foo.type#Bar 在Scala中,所有类型引用都可以作为针对命名实体的项目来编写。类型scala.String是scala.type#String的缩写,其中名称scala指的是包scala,类型String由scala包上的String类定义 显然,没有scala.String类,但我无法用Null复制它 scala> type N = scala.typ

我现在正在深入阅读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>type N=scala.type#Null
:7:错误:类型不匹配;
发现:类型
必需:AnyRef
类型N=scala.type#Null

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

下面是一个quick 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>
scala>class Foo{type T=String}
定义类Foo
scala>val foo=新foo
foo:foo=Foo@10babe8
scala>隐式[foo.type#T=:=foo.T]
res0:=:=[foo.T,foo.T]=

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

但根据SLS§3.1
的规定,路径是以下之一。。。p、 其中p是路径,x是p的稳定成员。稳定成员是软件包或。。。稳定标识符是以标识符结尾的路径。
scala.Null
是稳定标识符。对吗?不,所有稳定标识符都是值或包:
scala.Null
指定类型而不是值
scala
是一个稳定的标识符,但正如您所观察到的,作为一个包而不是一个对象,它的行为与运算符
中形成的单态类型不同。type
与我在回答中给出的示例
foo
不同。哦,现在,我终于明白了这都是关于
.type
行为的。花了这么多时间才明白。非常感谢:)@MilesSabin很抱歉打扰您,但我有一个关于行
隐式[foo.type#T=:=foo.T]
,=:=用于判断两个类型是否相同,因此结果是一个布尔值,但隐式方法需要一个T作为类型参数,那么为什么该行可以工作并以=:=[foo.T,foo.T]。@AllenChou不,它是一个函数,不是布尔值。
foo.type#T=:=foo.T
是一个中缀类型,它与
=:=[foo.type#T,foo.T]
,它扩展了(foo.type#T)=>foo.T。阅读
Predef
文档。返回的隐式证据是
=.tp。