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 x
disimpulkan dengan mencari tahu jenis y + z
, yang merupakan hal yang relatif sepele untuk dilakukan untuk kompiler. Untuk melakukan ini, jenis y
dan z
perlu 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 x
tetapi juga y
dan z
hanya 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 a
sini menunjukkan tipe polimorfik , sering disebut "generik" dalam bahasa lain seperti C ++. Bagian Num a =>
ini merupakan kendala untuk menunjukkan bahwa a
dukungan 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
f
harus berupa fungsi dari beberapa tipe arbitrer t
ke tipe yang sama t
.
fix
adalah fungsi yang menerima parameter tipe t -> t
dan mengembalikan hasil tipe t
.
x
,y
,z
adalah samaNum
jenis eric, tapi mereka masih bisaInteger
s,Double
s,Ratio Integer
s ... Haskell bersedia untuk membuat pilihan yang sewenang-wenang antara jenis numerik, tetapi tidak untuk typeclasses lainnya.