2012-02-25 19 views
94

que ver este código en este blog: Type-Level Programming in Scala:¿Qué significa el operador `#` 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. Como es difícil buscarlo (ignorado por los motores de búsqueda), ¿quién puede decirme qué significa?

+0

el "signo de la libra" se refiere a veces como "octathrop" (que la búsqueda de google me trajo a esta página). – philwalk

+2

Haga que [octothorpe o octothorp] (https://en.wikipedia.org/wiki/Number_sign) – smparkes

+0

¿Qué hay sobre otros operadores como # + y # - (consulte https://github.com/tpolecat/doobie/blob/series /0.4.x/yax/h2/src/main/scala/doobie/h2/H2Transactor.scala)? ¿Hay una lista completa? –

Respuesta

184

explicarlo, primero tenemos que explicar clases anidadas en Scala. Considere este ejemplo sencillo:

class A { 
    class B 

    def f(b: B) = println("Got my B!") 
} 

Ahora vamos a intentar algo con ella:

scala> val a1 = new A 
a1: A = [email protected] 

scala> val a2 = new A 
a2: A = [email protected] 

scala> a2.f(new a1.B) 
<console>:11: error: type mismatch; 
found : a1.B 
required: a2.B 
       a2.f(new a1.B) 
       ^

Cuando se declara una clase dentro de otra clase en la Scala, usted está diciendo que cada instancia de esa clase tiene tal una subclase. En otras palabras, no hay clase A.B, pero hay clases a1.B y a2.B, y son clases diferentes, como nos dice el mensaje de error anterior.

Si no entendió eso, busque los tipos que dependen de la ruta.

Ahora, # hace posible que consulte estas clases anidadas sin restringirla a una instancia en particular. En otras palabras, no hay A.B, pero hay A#B, lo que significa una clase anidada B de instancia de A.

Podemos ver esto en el trabajo, cambiando el código anterior:

class A { 
    class B 

    def f(b: B) = println("Got my B!") 
    def g(b: A#B) = println("Got a B.") 
} 

Y tratar a cabo:

scala> val a1 = new A 
a1: A = [email protected] 

scala> val a2 = new A 
a2: A = [email protected] 

scala> a2.f(new a1.B) 
<console>:11: error: type mismatch; 
found : a1.B 
required: a2.B 
       a2.f(new a1.B) 
       ^

scala> a2.g(new a1.B) 
Got a B. 
+0

Excelente ejemplo. Estoy totalmente de aceptar que funciona de esa manera, pero difícil de entender esto: Scala> classof [A # B] res7: Clase [A # B] = clase A $ B Scala> classof [AB] res8 : Clase [aB] = clase A $ B . lo que significa que tienen el mismo tipo en realidad? – Chiron

+2

Sus valores tienen la misma representación de cadena, e incluso podrían ser iguales. 'Class' es una representación en tiempo de ejecución de las clases de Java, y está limitado incluso en Java. Por ejemplo, 'List ' y 'List ' tienen el mismo motor de ejecución 'Class'. Si 'Clase 'no es lo suficientemente rico como para representar _Java_ tipos, es casi inútil cuando se representan _Scala_ tipos. De nuevo, 'res7: clase [A # B] = clase A $ B', a la izquierda del signo igual es un tipo, a la derecha del tipo igual si un valor que es la representación _runtime_ de Java de una clase. –

8

Se conoce como proyección de tipo, y se utiliza para acceder a miembros de tipo.

scala> trait R { 
    | type A = Int 
    | } 
defined trait R 

scala> val x = null.asInstanceOf[R#A] 
x: Int = 0 
+4

Esto no es una respuesta. Básicamente muestra el mismo código que la pregunta, solo un poco acortado. ¿Cuál es, por ejemplo, la diferencia a la notación puntual? ¿Dónde usaría este # en código real? – notan3xit

+1

@ notan3xit tal vez no responda a lo que quería preguntar.Pero lo que preguntaste fue "... que nunca he visto. Dado que es difícil buscarlo (ignorado por los motores de búsqueda), ¿quién puede decirme qué significa?". – nafg

Cuestiones relacionadas