Inferensi tipe Hindley-Milner digunakan untuk sistem tipe Hindley-Milner, pembatasan sistem tipe System-F. Fitur menarik dari sistem tipe HM adalah mereka memiliki parametrik polimorfisme (alias. Generik). Itu adalah fitur sistem tipe tunggal terbesar yang tidak dimiliki Golang.
Dengan pembatasan yang membuat frustasi, inferensi tipe HM tidak mungkin. Mari kita lihat kode yang tidak diketik:
func f(a) {
return a.method()
}
Apa jenis f
? Kita mungkin melihat bahwa a
harus memiliki sebuah metode, sehingga kita bisa menggunakan antarmuka anonim: func f(a interface { method() ??? }) ???
. Namun, kami tidak tahu apa tipe pengembaliannya. Dengan variabel tipe, kita bisa mendeklarasikan tipe sebagai
func f[T](a interface{ method() T }) T
Namun, Go tidak memiliki variabel tipe sehingga ini tidak akan berfungsi. Sementara antarmuka implisit membuat beberapa aspek inferensi tipe lebih mudah, kami sekarang tidak memiliki cara untuk mengetahui tipe kembalinya pemanggilan fungsi. Sistem-HM membutuhkan semua fungsi untuk dideklarasikan daripada diimplikasikan, dan setiap nama hanya dapat memiliki tipe tunggal (sedangkan metode Go dapat memiliki tipe yang berbeda di antarmuka yang berbeda).
Sebaliknya, Go mengharuskan fungsi selalu dideklarasikan sepenuhnya, tetapi memungkinkan variabel untuk menggunakan inferensi tipe. Ini dimungkinkan karena sisi kanan dari suatu tugas variable := expression
sudah memiliki tipe yang diketahui pada titik program tersebut. Jenis inferensi jenis ini sederhana, benar, dan linier.
- Jenis variabel segera dikenal pada titik deklarasi, sedangkan inferensi HM harus berpotensi mengetikkan seluruh program terlebih dahulu. Ini memiliki dampak nyata pada kualitas pesan kesalahan juga.
- Pendekatan inferensi tipe Go akan selalu memilih tipe yang paling spesifik untuk suatu variabel, berbeda dengan HM yang memilih tipe yang paling umum. Ini berfungsi dengan baik dengan subtyping, bahkan dengan antarmuka implisit Go.