Hindley-Milner tipi çıkarım, System-F tipi sistemlerin bir kısıtlaması olan Hindley-Milner tipi sistemler için kullanılır. HM tipi sistemlerin ilginç özelliği, parametrik polimorfizme (yani jenerik) sahip olmalarıdır . Golang'ın reddettiği en büyük tek tür sistem özelliği budur.
Bu sinir bozucu kısıtlama ile, HM tarzı tip çıkarım mümkün değildir. Yazılmamış koda bakalım:
func f(a) {
return a.method()
}
Türü nedir f
? Biz fark edebilirsiniz a
bir yöntem olması gerekir, bu yüzden anonim bir arayüz kullanabilirsiniz: func f(a interface { method() ??? }) ???
. Ancak, iade türünün ne olduğu hakkında hiçbir fikrimiz yok. Yazım değişkenleriyle, türü şu şekilde ilan edebiliriz:
func f[T](a interface{ method() T }) T
Ancak, Go'nun değişkenleri olmadığından bu işe yaramaz. Örtük arabirimler, tür çıkarımının bazı yönlerini kolaylaştırırken, artık bir işlev çağrısının dönüş türünü bulamayacağımız bir yol yok. HM sistemi ima edilmek yerine tüm fonksiyonların ilan edilmesini gerektirir ve her isim sadece tek bir tipe sahip olabilir (Go'nun metotları farklı arayüzlerde farklı tiplerde olabilir).
Bunun yerine, Go, işlevlerin her zaman tam olarak bildirilmesini gerektirir, ancak değişkenlerin tür çıkarımı kullanmasına izin verir. Bu mümkündür, çünkü ödevin sağ tarafında variable := expression
programın o noktasında bilinen bir tür zaten vardır. Bu tür bir tür çıkarım, basit, doğru ve doğrusaldır.
- Bir değişkenin türü derhal bildirim noktasında bilinir, oysa HM çıkarımının önce tüm programı potansiyel olarak kontrol etmesi gerekir. Bunun da hata mesajlarının kalitesi üzerinde gözle görülür bir etkisi vardır.
- Go'nun tür çıkarımı yaklaşımı, en genel türü seçen HM'nin aksine, bir değişken için her zaman en spesifik türü seçer. Bu, Go'nun gizli arayüzleriyle bile, alt tipleme ile temiz bir şekilde çalışır.