La inferencia de tipo de Scala se basa en el flujo. Los métodos y las funciones necesitan tipos de parámetros explícitos, que se utilizan para inferir otros tipos. Los tipos de parámetros no pueden inferirse del método o del cuerpo de la función. A veces, sin embargo, los tipos de parámetros se conocen desde el contexto externo, y luego no tienen que estar etiquetados. Dos ejemplos,
val f: String => Unit = hello("aaa", _)
val s = Seq(1,2).map(_+1) // Seq[Int].map expects a function of Int argument type
A continuación se muestra una cita de Martin Odersky sobre las limitaciones de la inferencia de tipos de Scala en comparación con, por ejemplo, ML y Haskell. Los desafíos incluyen la sobrecarga de Scala, la selección de registros, y subtipos, así como la necesidad de mantener las cosas simples,
La razón Scala no tiene Hindley/Milner tipo de inferencia es que es muy difícil de combinar con características tales como sobrecarga (la variante ad-hoc , no las clases de tipo), selección de registro y subtipificación. No digo imposible: existen varias extensiones que incorporan estas características; de hecho, he sido guitly de algunos de ellos . Solo digo que es muy difícil hacer que esto funcione bien en la práctica , donde uno necesita expresiones de tipo pequeño y buenos mensajes de error . Tampoco es un caso cerrado: muchos investigadores están trabajando en para ampliar los límites aquí (por ejemplo, en el MLF de Remy). Pero en este momento es una compensación de mejor tipo de referencia vs mejor soporte para estas características. Puede hacer que las dos formas de compensación sean . El hecho de que quisiéramos integrar con Java inclinaba las escalas a favor de la subtipificación y de Hindley/Milner.
Fuente: comentario en la publicación Universal Type Inference is a Bad Thing.
pero en mi código, solo hay un método 'hello'. ¿Quiere decir que la clase puede extenderse y la subclase puede anular el método 'hello' y romper el código? – Freewind
Debo admitir que no estoy seguro de si esto es realmente posible con la creación de subclases. Pero incluso sin él, creo que hace que sea un poco más consistente para requerir siempre la anotación de tipo. De lo contrario, todo el código sin una anotación de tipo que se rompería de repente, si elige agregar una sobrecarga. – Debilski
Tengo curiosidad de por qué, en ese caso, 'm1' no es solo polimórfico sobre el tipo de argumento. –