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
1 para dar las razones teóricas – axel22
@soc Podría vincular un documento que indica que HM inferencia es indecidible con subtipos? Tengo problemas para encontrar algo sobre eso. –
"Límites inferiores en la inferencia de tipo con subtipos" http://dl.acm.org/citation.cfm?id=199481 –