2012-05-11 1 views
7

Я сейчас читаю Scala. Вот выдержка из книги:Являются ли типы зависимых типов проекциями?

Все типы, зависящие от пути, представляют собой проекции типа. Путь-зависимый тип foo.Bar переписывается как foo.type#Bar компилятором ...

В Scala, все ссылки типа может быть записана в виде проектов в отношении названных лиц. Тип scala.String является сокращением для scala.type#String, где имя scala относится к пакету scala, а тип String определяется классом String в пакете scala.

Очевидно, что это не 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

Вот краткий сеанс РЕПЛ, который подтверждает то, что написал Джош

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. Стабильными членами являются пакеты или ... Устойчивый идентификатор - это путь, который заканчивается идентификатором. 'Scala.Null' является стабильным идентификатором. Правильно? – 4e6

+0

Нет, все стабильные идентификаторы являются значениями или пакетами: 'scala.Null' обозначает тип, а не значение. 'scala' является стабильным идентификатором, но, как вы заметили, являясь пакетом, а не объектом, его поведение по отношению к одноэлементному типу, образующемуся в operator' .type', отличается от примера 'foo', который я дал в своем ответе. –

+0

О, теперь, наконец, я вижу, что все дело в стиле '.type'. Это заняло много времени, чтобы понять это. Большое спасибо :) – 4e6