La inferencia de tipo Hindley-Milner se usa para sistemas de tipo Hindley-Milner, una restricción de los sistemas de tipo System-F. La característica interesante de los sistemas de tipo HM es que tienen polimorfismo paramétrico (también conocido como genéricos). Esa es la característica de sistema de tipo más grande que Golang se niega a tener.
Con esa restricción frustrante, la inferencia tipo HM es imposible. Veamos el código sin tipo:
func f(a) {
return a.method()
}
¿De qué tipo es f
? Podríamos notar que a
debe tener un método, por lo que podríamos usar una interfaz anónimo: func f(a interface { method() ??? }) ???
. Sin embargo, no tenemos idea de cuál es el tipo de retorno. Con las variables de tipo, podríamos declarar el tipo como
func f[T](a interface{ method() T }) T
Sin embargo, Go no tiene variables de tipo, por lo que esto no funcionará. Si bien las interfaces implícitas facilitan algunos aspectos de la inferencia de tipos, ahora no tenemos forma de averiguar el tipo de retorno de una llamada de función. El sistema HM requiere que todas las funciones se declaren en lugar de estar implícitas, y cada nombre solo puede tener un solo tipo (mientras que los métodos de Go pueden tener diferentes tipos en diferentes interfaces).
En cambio, Go requiere que las funciones siempre estén completamente declaradas, pero permite que las variables usen inferencia de tipos. Esto es posible porque el lado derecho de una tarea variable := expression
ya tiene un tipo conocido en ese punto del programa. Este tipo de inferencia de tipos es simple, correcta y lineal.
- El tipo de una variable se conoce inmediatamente en el punto de la declaración, mientras que la inferencia HM tiene que verificar primero todo el programa. Esto también tiene un impacto notable en la calidad de los mensajes de error.
- El enfoque de inferencia de tipos de Go siempre seleccionará el tipo más específico para una variable, en contraste con HM, que elige el tipo más general. Esto funciona limpiamente con subtipificación, incluso con las interfaces implícitas de Go.
map
,filter
yreduce
son todos inexplicable dentro de GO es muy limitado sistema de tiposgengen
ygonerics