¿Qué significa “ningún tipo de inferencia global” significa en relación con Scala?

StackOverflow https://stackoverflow.com/questions/4304003

Pregunta

He leído que la inferencia de tipos de Scala no es tan global que es la razón por la gente debe colocar anotaciones de tipos en los métodos. (Sería esto la inferencia de tipo "local"?)

Sólo un poco de entender que la razón es por su naturaleza orientada a objetos, pero se me escapa de claridad. ¿Hay una explicación para la "inferencia de tipo global" y por qué Scala no puede tenerlo que un principiante puede entender?

¿Fue útil?

Solución

El ejemplo típico de un tipo de inferencia global es Hindley-Milner : Se necesita una determinado programa y "calcula" todos los tipos necesarios. Sin embargo, a fin de lograr esto, el lenguaje dado tiene que tener algunas propiedades (hay extensiones a HM, que tratan de superar algunas de estas restricciones). Hay dos cosas que no le gusta HM son herencia y sobrecarga de métodos. Por lo que yo entiendo que estos son los principales obstáculos para la Scala para adoptar HM o alguna variante de la misma. Tenga en cuenta que en la práctica, incluso idiomas, que dependen en gran medida HM nunca alcanzan una inferencia 100%, por ejemplo, incluso en Haskell necesita una anotación de tipo de vez en cuando.

Así Scala utiliza una más limitada (como usted dice "local") forma de inferencia de tipos, que todavía es mejor que nada. Por lo que yo puedo decir al equipo Scala trata de mejorar el tipo de inferencia a partir de una versión a otra, cuando es posible, pero hasta ahora he visto pasos sólo pequeñas. La brecha a un tipo inferencer estilo HM sigue siendo enorme, y no se puede cerrar completamente.

Otros consejos

El problema es que tipo HM inferencia es indecidible en general en un idioma con subtipificación, sobrecarga o características similares. Ref Esto significa que más y más cosas podría añadirse a la inferencer para que sea inferir casos más especiales, pero siempre habrá código donde se producirá un error.

Scala ha tomado la decisión de hacer anotaciones de tipos de argumentos del método y algunos otros lugares obligatorios. Esto podría parecer una molestia en primer lugar, pero tenga en cuenta que esto ayuda a documentar el código y proporciona el compilador con información que puede entender en un solo lugar. Además, las lenguas con HM inferencia sufren a menudo el problema de que los errores de programación a veces se detectan en el código lejos del error original, debido a que el algoritmo de HM acaba de ir adelante y pasó (por casualidad) para inferir otras partes del código con el tipo defectuosa dedujo antes de que fallara.

inferencia de Scala, básicamente, funciona desde el exterior (definición del método) al interior (código dentro del método) y por lo tanto limita el impacto de un tipo de anotación incorrecta.

Idiomas con HM trabajo inferencia desde el interior hacia el exterior (ignorando la posibilidad de añadir anotaciones de tipo) que significa que hay una posibilidad de que un pequeño cambio de código en un único método puede cambiar el significado de todo el programa. Esto puede ser bueno o malo.


Ref: Lower bounds on type inference with subtypes

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top