Vejo este código neste blog: Programação em nível de tipo no 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]
}
Existe um operador #
no código R#X[R#Next]
que eu nunca vi. Como é difícil pesquisá-lo (ignorado pelos mecanismos de pesquisa), quem pode me dizer o que isso significa?
scala
type-systems
Vento livre
fonte
fonte
Respostas:
Para explicar, primeiro precisamos explicar as classes aninhadas no Scala. Considere este exemplo simples:
Agora vamos tentar algo com isso:
Quando você declara uma classe dentro de outra classe no Scala, está dizendo que cada instância dessa classe possui uma subclasse. Em outras palavras, não há nenhuma
A.B
classe, mas existema1.B
ea2.B
aulas, e eles são diferentes classes, como a mensagem de erro está nos dizendo acima.Se você não entendeu isso, procure os tipos dependentes do caminho.
Agora,
#
é possível consultar essas classes aninhadas sem restringi-las a uma instância específica. Em outras palavras, não existeA.B
, mas existeA#B
, o que significa umaB
classe aninhada de qualquer instância deA
.Podemos ver isso no trabalho, alterando o código acima:
E experimentando:
fonte
Class
é uma representação em tempo de execução de classes Java e é limitada mesmo em Java. Por exemplo,List<String>
eList<Integer>
tem o mesmo tempo de execuçãoClass
. SeClass
não for rico o suficiente para representar os tipos Java , é quase inútil ao representar os tipos Scala . Novamente, ares7: Class[A#B] = class A$B
esquerda do sinal de igual é um tipo, à direita do tipo igual se um valor que é a representação do Java Runtime de uma classe.É conhecido como projeção de tipo e é usado para acessar os membros do tipo.
fonte
Basicamente, é uma maneira de se referir a classes dentro de outras classes.
http://jim-mcbeath.blogspot.com/2008/09/scala-syntax-primer.html (procure por "libra")
fonte
Aqui está um recurso para pesquisar "operadores simbólicos" (que são realmente métodos), mas ainda não descobri como escapar de "#" para pesquisar no scalex)
http://www.artima.com/pins1ed/book-index.html#indexanchor
fonte