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 xviene dedotto scoprendo il tipo di y + z, che è una cosa relativamente banale da fare per il compilatore. Per fare questo, i tipi di ye zdevono 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 xma anche ye zsemplicemente 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 aqui indica un tipo polimorfico , spesso chiamato "generici" in altri linguaggi come C ++. La Num a =>parte è un vincolo per indicare che il asupporto 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
fdeve essere una funzione da un tipo arbitrario tallo stesso tipo t.
fixè una funzione che riceve un parametro di tipo t -> te restituisce un risultato di tipo t.
x,y,zsono gli stessiNumtipo Eric, ma possono ancora essereIntegers,Doubles,Ratio Integers ... Haskell è disposto a fare una scelta arbitraria tra tipi numerici, ma non per altri typeclasses.