2010-11-29 11 views
13

He leído que la inferencia de tipos de Scala no es global, por eso las personas deben colocar anotaciones de tipo en los métodos. (¿Sería esto una inferencia tipo "local"?)¿Qué significa "sin inferencia de tipo global" con respecto a Scala?

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

Respuesta

16

El ejemplo típico para una inferencia de tipo global es Hindley-Milner: toma un programa determinado y "calcula" todos los tipos necesarios. Sin embargo, para lograr esto, el lenguaje dado debe tener algunas propiedades (hay extensiones de HM, que intentan superar algunas de estas restricciones). Dos cosas que a HM no le gustan son la herencia y la sobrecarga de métodos. Por lo que yo sé, estos son los principales obstáculos para que Scala adopte HM o alguna variante de este. Tenga en cuenta que, en la práctica, incluso los lenguajes que dependen mucho de HM nunca alcanzan una inferencia del 100%, p. incluso en Haskell necesita una anotación de tipo de vez en cuando.

Entonces Scala usa una forma más limitada (como dices "local") de inferencia de tipo, que es mejor que nada. Por lo que puedo decir, el equipo de Scala intenta mejorar la inferencia tipo de lanzamiento a lanzamiento cuando es posible, pero hasta ahora solo he visto pasos más pequeños. La brecha con una referencia de tipo de estilo HM sigue siendo enorme y no se puede cerrar por completo.

22

El problema es que la inferencia del tipo HM es indecidible en general en un lenguaje con subtipado, sobrecarga o características similares. Ref Esto significa que se podrían agregar más y más cosas al inferencer para hacer que infiera más casos especiales, pero siempre habrá un código en el que fallará.

Scala ha tomado la decisión de hacer anotaciones tipo en los argumentos del método y en otros lugares obligatorios. Esto puede parecer una molestia primero, pero considere que esto ayuda a documentar el código y proporciona al compilador información que puede entender en un solo lugar. Además, los lenguajes con inferencia de HM suelen tener el problema de que los errores de programación a veces se detectan en un código alejado del error original, porque el algoritmo de HM simplemente siguió y pasó (por casualidad) para inferir otras partes del código con el tipo defectuoso. infería antes de que fallara.

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

Los idiomas con inferencia HM funcionan desde el interior hacia el exterior (ignorando la posibilidad de agregar anotaciones tipo) lo que significa que existe la posibilidad de que un pequeño cambio de código en un solo método pueda cambiar el significado de todo el programa. Esto puede ser bueno o malo.


Ref: Lower bounds on type inference with subtypes

+0

1 para dar las razones teóricas – axel22

+3

@soc Podría vincular un documento que indica que HM inferencia es indecidible con subtipos? Tengo problemas para encontrar algo sobre eso. –

+1

"Límites inferiores en la inferencia de tipo con subtipos" http://dl.acm.org/citation.cfm?id=199481 –

Cuestiones relacionadas