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 x
se deduce descubriendo el tipo de y + z
, que es algo relativamente trivial para el compilador. Para hacer esto, los tipos y
y z
deben 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 x
sino también y
y z
simplemente 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 a
aquí 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 a
soporte 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
f
debe ser una función de algún tipo arbitrario t
al mismo tipo t
.
fix
es una función que recibe un parámetro de tipo t -> t
y devuelve un resultado de tipo t
.
x
,y
,z
son los mismosNum
Tipo de Eric, pero todavía puede serInteger
s,Double
s,Ratio Integer
s ... Haskell está dispuesto a hacer una elección arbitraria entre tipos numéricos, pero no para otras clases de tipos.