Vea esta respuesta de StackOverflow con respecto a la inferencia de tipos de Go. No estoy familiarizado con Go, pero según esta respuesta parece una "deducción de tipo" unidireccional (para tomar prestada alguna teminología de C ++). Significa que si tienes:
x := y + z
entonces el tipo de xse deduce descubriendo el tipo de y + z, que es algo relativamente trivial para el compilador. Para hacer esto, los tipos yy zdeben conocerse a priori : esto podría hacerse mediante anotaciones de tipo o inferirse de los literales asignados a ellos.
En contraste, la mayoría de los lenguajes funcionales tienen inferencia de tipo que usa toda la información posible dentro de un módulo (o función, si el algoritmo de inferencia es local) para derivar el tipo de las variables. Los algoritmos de inferencia complicados (como Hindley-Milner) a menudo involucran alguna forma de unificación de tipo (un poco como resolver ecuaciones) detrás de escena. Por ejemplo, en Haskell, si escribes:
let x = y + z
entonces Haskell puede inferir el tipo no solo xsino también yy zsimplemente basándose en el hecho de que está realizando una adición en ellos. En este caso:
x :: Num a => a
y :: Num a => a
z :: Num a => a
(La letra minúscula aaquí denota un tipo polimórfico , a menudo llamado "genéricos" en otros lenguajes como C ++. La Num a =>parte es una restricción para indicar que el asoporte de tipo tiene alguna noción de adición).
Aquí hay un ejemplo más interesante: el combinador de punto fijo que permite definir cualquier función recursiva:
let fix f = f (fix f)
Tenga en cuenta que en ninguna parte hemos especificado el tipo de f, ni hemos especificado el tipo de fix, sin embargo, el compilador de Haskell puede descubrir automáticamente que:
f :: t -> t
fix :: (t -> t) -> t
Esto dice que:
- El parámetro
fdebe ser una función de algún tipo arbitrario tal mismo tipo t.
fixes una función que recibe un parámetro de tipo t -> ty devuelve un resultado de tipo t.
x,y,zson los mismosNumTipo de Eric, pero todavía puede serIntegers,Doubles,Ratio Integers ... Haskell está dispuesto a hacer una elección arbitraria entre tipos numéricos, pero no para otras clases de tipos.