Я вижу этот код в этом блоге: Программирование на уровне типов в Scala :
// define the abstract types and bounds
trait Recurse {
type Next <: Recurse
// this is the recursive function definition
type X[R <: Recurse] <: Int
}
// implementation
trait RecurseA extends Recurse {
type Next = RecurseA
// this is the implementation
type X[R <: Recurse] = R#X[R#Next]
}
object Recurse {
// infinite loop
type C = RecurseA#X[RecurseA]
}
В #
коде есть оператор, R#X[R#Next]
которого я никогда не видел. Поскольку его трудно искать (игнорируется поисковыми системами), кто может сказать мне, что это означает?
scala
type-systems
Freewind
источник
источник
Ответы:
Чтобы объяснить это, мы сначала должны объяснить вложенные классы в Scala. Рассмотрим этот простой пример:
Теперь попробуем что-нибудь с этим:
Когда вы объявляете класс внутри другого класса в Scala, вы говорите, что каждый экземпляр этого класса имеет такой подкласс. Другими словами, нет
A.B
класса, но естьa1.B
иa2.B
классы, и они разные классы, так как сообщение об ошибке говорит нам выше.Если вы этого не поняли, найдите типы, зависящие от пути.
Теперь
#
это дает вам возможность ссылаться на такие вложенные классы, не ограничивая их конкретным экземпляром. Другими словами, нетA.B
, но естьA#B
, что означаетB
вложенный класс любого экземпляраA
.Мы можем увидеть это в работе, изменив код выше:
И попробуем:
источник
Class
представляет собой представление классов Java во время выполнения, и оно ограничено даже в Java. Например,List<String>
иList<Integer>
иметь такое же время выполненияClass
. ЕслиClass
он недостаточно богат для представления типов Java , он почти бесполезен при представлении типов Scala . Опять же,res7: Class[A#B] = class A$B
слева от знака равенства является тип, справа от типа равенства, если значение, которое является представлением класса среды выполнения Java .Он известен как проекция типа и используется для доступа к членам типа.
источник
По сути, это способ ссылки на классы внутри других классов.
http://jim-mcbeath.blogspot.com/2008/09/scala-syntax-primer.html (поиск по слову «фунт»)
источник
Вот ресурс для поиска «символических операторов» (которые на самом деле являются методами), но я не понял, как избежать символа «#» для поиска в scalex)
http://www.artima.com/pins1ed/book-index.html#indexanchor
источник