Voir cette réponse StackOverflow concernant l'inférence de type de Go. Je ne suis pas familier avec Go moi-même, mais sur la base de cette réponse, cela semble être une "déduction de type" à sens unique (pour emprunter de la téminologie C ++). Cela signifie que si vous avez:
x := y + z
puis le type de x
est déduit en déterminant le type de y + z
, ce qui est une chose relativement banale à faire pour le compilateur. Pour ce faire, les types de y
et z
doivent être connus a priori : cela peut être fait via des annotations de type ou déduit des littéraux qui leur sont attribués.
En revanche, la plupart des langages fonctionnels ont une inférence de type qui utilise toutes les informations possibles dans un module (ou une fonction, si l'algorithme d'inférence est local) pour dériver le type des variables. Les algorithmes d'inférence compliqués (tels que Hindley-Milner) impliquent souvent une certaine forme d' unification de type (un peu comme la résolution d'équations) dans les coulisses. Par exemple, dans Haskell, si vous écrivez:
let x = y + z
Haskell peut alors déduire le type non seulement x
mais aussi y
et z
simplement en se basant sur le fait que vous effectuez des ajouts sur eux. Dans ce cas:
x :: Num a => a
y :: Num a => a
z :: Num a => a
(Les minuscules a
désignent ici un type polymorphe , souvent appelé «génériques» dans d'autres langages comme C ++. La Num a =>
partie est une contrainte pour indiquer que le a
support de type a une certaine notion d'addition.)
Voici un exemple plus intéressant: le combinateur à virgule fixe qui permet de définir n'importe quelle fonction récursive:
let fix f = f (fix f)
Notez que nulle part nous n'avons spécifié le type de f
, ni nous n'avons spécifié le type de fix
, pourtant le compilateur Haskell peut automatiquement comprendre que:
f :: t -> t
fix :: (t -> t) -> t
Cela dit que:
- Le paramètre
f
doit être une fonction d'un type arbitraire t
au même type t
.
fix
est une fonction qui reçoit un paramètre de type t -> t
et renvoie un résultat de type t
.
x
,y
,z
sont les mêmesNum
types eric, mais ils peuvent encoreInteger
s,Double
s,Ratio Integer
s ... Haskell est prêt à faire un choix arbitraire entre les types numériques, mais pas pour d' autres classes de types.