Veo este código en este blog: Programación de nivel de tipo en 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]
}
Hay un operador #
en el código R#X[R#Next]
que nunca he visto. Dado que es difícil buscarlo (ignorado por los motores de búsqueda), ¿quién puede decirme qué significa?
scala
type-systems
Viento libre
fuente
fuente
Respuestas:
Para explicarlo, primero tenemos que explicar las clases anidadas en Scala. Considere este simple ejemplo:
Ahora intentemos algo con eso:
Cuando declaras una clase dentro de otra clase en Scala, estás diciendo que cada instancia de esa clase tiene dicha subclase. En otras palabras, no hay
A.B
clase, pero haya1.B
ya2.B
clases, y son diferentes clases, como el mensaje de error nos dice más arriba.Si no entendió eso, busque los tipos dependientes de la ruta.
Ahora,
#
le permite referirse a tales clases anidadas sin restringirlo a una instancia particular. En otras palabras, no hayA.B
, pero hayA#B
, lo que significa unaB
clase anidada de cualquier instancia deA
.Podemos ver esto en el trabajo cambiando el código anterior:
Y probándolo:
fuente
Class
es una representación en tiempo de ejecución de las clases de Java, y está limitada incluso en Java. Por ejemplo,List<String>
yList<Integer>
tener el mismo tiempo de ejecuciónClass
. SiClass
no es lo suficientemente rico como para representar tipos de Java , es casi inútil cuando se representan tipos de Scala . Una vez más, a lares7: Class[A#B] = class A$B
izquierda del signo igual es un tipo, a la derecha del tipo igual si un valor que es la representación en tiempo de ejecución Java de una clase.Se conoce como proyección de tipo y se usa para acceder a los miembros de tipo.
fuente
Básicamente, es una forma de referirse a clases dentro de otras clases.
http://jim-mcbeath.blogspot.com/2008/09/scala-syntax-primer.html (busque "libra")
fuente
Aquí hay un recurso para buscar "operadores simbólicos" (que son realmente métodos), pero no he descubierto cómo escapar de "#" para buscar en scalex)
http://www.artima.com/pins1ed/book-index.html#indexanchor
fuente