Lihat jawaban StackOverflow ini tentang inferensi tipe Go. Saya tidak terbiasa dengan Go sendiri tetapi berdasarkan jawaban ini sepertinya "cara mengurangi" satu arah (untuk meminjam beberapa teminologi C ++). Ini berarti bahwa jika Anda memiliki:
x := y + z
maka jenis xdisimpulkan dengan mencari tahu jenis y + z, yang merupakan hal yang relatif sepele untuk dilakukan untuk kompiler. Untuk melakukan ini, jenis ydan zperlu diketahui apriori : ini dapat dilakukan melalui anotasi jenis atau disimpulkan dari literal yang ditugaskan kepadanya.
Sebaliknya, sebagian besar bahasa fungsional memiliki tipe inferensi yang menggunakan semua informasi yang mungkin dalam modul (atau fungsi, jika algoritma inferensi lokal) untuk mendapatkan jenis variabel. Algoritma inferensi yang rumit (seperti Hindley-Milner) sering melibatkan beberapa bentuk penyatuan tipe (sedikit seperti memecahkan persamaan) di belakang layar. Misalnya, di Haskell, jika Anda menulis:
let x = y + z
maka Haskell dapat menyimpulkan jenis tidak hanya xtetapi juga ydan zhanya berdasarkan pada fakta bahwa Anda melakukan penambahan pada mereka. Pada kasus ini:
x :: Num a => a
y :: Num a => a
z :: Num a => a
(Huruf kecil di asini menunjukkan tipe polimorfik , sering disebut "generik" dalam bahasa lain seperti C ++. Bagian Num a =>ini merupakan kendala untuk menunjukkan bahwa adukungan tipe memiliki beberapa gagasan tambahan.)
Berikut ini contoh yang lebih menarik: kombinator titik tetap yang memungkinkan setiap fungsi rekursif didefinisikan:
let fix f = f (fix f)
Perhatikan bahwa kami belum menentukan jenisnya f, kami juga tidak menentukan jenisnya fix, namun kompiler Haskell dapat secara otomatis mengetahui bahwa:
f :: t -> t
fix :: (t -> t) -> t
Ini mengatakan bahwa:
- Parameter
fharus berupa fungsi dari beberapa tipe arbitrer tke tipe yang sama t.
fixadalah fungsi yang menerima parameter tipe t -> tdan mengembalikan hasil tipe t.
x,y,zadalah samaNumjenis eric, tapi mereka masih bisaIntegers,Doubles,Ratio Integers ... Haskell bersedia untuk membuat pilihan yang sewenang-wenang antara jenis numerik, tetapi tidak untuk typeclasses lainnya.