2010-04-22 17 views
110

He oído que Scala tiene tipos dependientes de la ruta. Tiene algo que ver con las clases internas, pero ¿qué significa esto realmente y por qué me importa?¿Qué se entiende por tipos dependientes de ruta de Scala?

+2

@Michel - Incluso sé qué son los PDT; ¡Esperaba que SO pudiera enriquecerse con una respuesta! –

+1

Espero que haya una respuesta tersely después de leer ch12 sobre PDT – stacker

+4

roto de nuevo: | – simao

Respuesta

143

Mi ejemplo favorito:

case class Board(length: Int, height: Int) { 
    case class Coordinate(x: Int, y: Int) { 
    require(0 <= x && x < length && 0 <= y && y < height) 
    } 
    val occupied = scala.collection.mutable.Set[Coordinate]() 
} 

val b1 = Board(20, 20) 
val b2 = Board(30, 30) 
val c1 = b1.Coordinate(15, 15) 
val c2 = b2.Coordinate(25, 25) 
b1.occupied += c1 
b2.occupied += c2 
// Next line doesn't compile 
b1.occupied += c2 

Por lo tanto, el tipo de Coordinate depende de la instancia de Board desde el que se crea una instancia. Hay todo tipo de cosas que se pueden lograr con esto, dando un tipo de seguridad que depende de los valores y no solo de los tipos.

Esto puede sonar como tipos dependientes, pero es más limitado. Por ejemplo, el tipo de occupied depende del valor de Board. Arriba, la última línea no funciona porque el tipo de c2 es b2.Coordinate, mientras que el tipo de occupied es Set[b1.Coordinate]. Tenga en cuenta que se puede usar otro identificador con el mismo tipo de b1, por lo que no es el identificadorb1 que está asociado con el tipo. Por ejemplo, los siguientes trabajos:

val b3: b1.type = b1 
val c3 = b3.Coordinate(10, 10) 
b1.occupied += c3 
+1

+1 por la respuesta. La última frase me resulta confusa: dices 'tipo de seguridad que depende de los valores y no solo de los tipos'. Para mí, esto suena como tipos dependientes, pero los tipos dependientes de la ruta no dependen de los valores per se. ¿Crees que es confuso también? –

+2

@Matthew Entiendo lo que dices, pero los tipos dependientes de rutas _do_ dependen de los valores, incluso si no proporcionan la flexibilidad normalmente asociada con los tipos dependientes. –

+0

Por valores, ¿quiere decir el valor de b1, o los valores que se pasan al constructor de b1 (es decir, 20). Puedo entender si te refieres a b1, pero no puedo ver el efecto que el 20 tiene en el código. –

Cuestiones relacionadas