Vedi questa risposta StackOverflow per quanto riguarda l'inferenza del tipo di Go. Non ho familiarità con Go me stesso, ma sulla base di questa risposta sembra una "deduzione del tipo" unidirezionale (prendere in prestito un po 'di teminologia C ++). Significa che se hai:
x := y + z
quindi il tipo di x
viene dedotto scoprendo il tipo di y + z
, che è una cosa relativamente banale da fare per il compilatore. Per fare questo, i tipi di y
e z
devono essere conosciuti a priori : questo potrebbe essere fatto tramite annotazioni sui tipi o dedotto dai letterali loro assegnati.
Al contrario, la maggior parte dei linguaggi funzionali ha inferenza di tipo che utilizza tutte le informazioni possibili all'interno di un modulo (o funzione, se l'algoritmo di inferenza è locale) per derivare il tipo di variabili. Gli algoritmi di inferenza complicata (come Hindley-Milner) spesso implicano una qualche forma di unificazione del tipo (un po 'come risolvere equazioni) dietro le quinte. Ad esempio, in Haskell, se scrivi:
let x = y + z
quindi Haskell può dedurre il tipo non solo x
ma anche y
e z
semplicemente in base al fatto che stai eseguendo l'aggiunta su di essi. In questo caso:
x :: Num a => a
y :: Num a => a
z :: Num a => a
(La minuscola a
qui indica un tipo polimorfico , spesso chiamato "generici" in altri linguaggi come C ++. La Num a =>
parte è un vincolo per indicare che il a
supporto del tipo ha qualche nozione di addizione.)
Ecco un esempio più interessante: il combinatore a punto fisso che consente di definire qualsiasi funzione ricorsiva:
let fix f = f (fix f)
Si noti che da nessuna parte abbiamo specificato il tipo di f
, né specificato il tipo di fix
, ma il compilatore Haskell può automaticamente capire che:
f :: t -> t
fix :: (t -> t) -> t
Questo dice che:
- Il parametro
f
deve essere una funzione da un tipo arbitrario t
allo stesso tipo t
.
fix
è una funzione che riceve un parametro di tipo t -> t
e restituisce un risultato di tipo t
.
x
,y
,z
sono gli stessiNum
tipo Eric, ma possono ancora essereInteger
s,Double
s,Ratio Integer
s ... Haskell è disposto a fare una scelta arbitraria tra tipi numerici, ma non per altri typeclasses.