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?
Respuesta
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 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? –
@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. –
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. –
- 1. Scala: Equivalencia de tipos dependientes de ruta
- 2. ¿Qué se entiende por inmutable?
- 3. ¿Qué se entiende por WS- *?
- 4. ¿Qué se entiende por tipo parametrizado?
- 5. ¿Qué se entiende por metadatos en Android?
- 6. ¿Qué se entiende por .delegate = self?
- 7. ¿Qué se entiende por el término "Instrumentación"?
- 8. ¿Qué se entiende por deshabilitar las interrupciones?
- 9. ¿Qué se entiende por modo de enlace en WebSphere MQ?
- 10. ¿Qué se entiende por autenticación de dos patas?
- 11. ¿Qué se entiende por 'objeto de primera clase'?
- 12. Accediendo a tipos de clases base dependientes
- 13. Tipos de métodos dependientes y clases de tipos
- 14. ¿Qué se entiende por clases en sí mismas son objetos?
- 15. ¿Qué se entiende por "sustituciones que evitan la captura"?
- 16. ¿Qué se entiende por el término "pila web"?
- 17. ¿Qué se entiende por conexión. Deshacer() en C#?
- 18. ¿Qué se entiende por el término "objeto sucio"?
- 19. ¿Qué se entiende por CoreData no es seguro para subprocesos?
- 20. Lo que se entiende por 'MyType = Int => Boole'
- 21. relación entre los tipos interiores dependientes de la trayectoria en la Scala
- 22. Inferir implementaciones de métodos predeterminados mutuamente dependientes en Scala
- 23. ¿Por qué no puede Python inferir tipos como scala?
- 24. Problemas con tipos dependientes en las plantillas
- 25. ¿Qué se entiende por marco, lenguaje de programación y lenguaje de scripting?
- 26. ¿Qué se entiende por tamaño de archivo y tamaño de datos en MongoDB?
- 27. ¿Por qué los tipos primitivos como Int se borran a Object en Scala?
- 28. ¿Qué se entiende por "falla" en la protección contra fallas rápidas de IIS?
- 29. ¿Qué se entiende por 'modificación de consultas' como un enfoque para implementar vistas?
- 30. ¿Qué se entiende por pruebas A/B de un sitio web?
@Michel - Incluso sé qué son los PDT; ¡Esperaba que SO pudiera enriquecerse con una respuesta! –
Espero que haya una respuesta tersely después de leer ch12 sobre PDT – stacker
roto de nuevo: | – simao