Я сейчас читаю 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?
Но согласно SLS §3.1 'Путь является одним из следующих ... p.x где p - путь, а x - устойчивый член p. Стабильными членами являются пакеты или ... Устойчивый идентификатор - это путь, который заканчивается идентификатором. 'Scala.Null' является стабильным идентификатором. Правильно? – 4e6
Нет, все стабильные идентификаторы являются значениями или пакетами: 'scala.Null' обозначает тип, а не значение. 'scala' является стабильным идентификатором, но, как вы заметили, являясь пакетом, а не объектом, его поведение по отношению к одноэлементному типу, образующемуся в operator' .type', отличается от примера 'foo', который я дал в своем ответе. –
О, теперь, наконец, я вижу, что все дело в стиле '.type'. Это заняло много времени, чтобы понять это. Большое спасибо :) – 4e6