Go'nun tür çıkarımıyla ilgili bu StackOverflow yanıtına bakın . Kendime Go aşina değilim ama bu cevaba dayanarak (bazı C ++ teminoloji ödünç almak için) tek yönlü bir "tür kesinti" gibi görünüyor. Bu, eğer varsa:
x := y + z
daha sonra derleyici için yapılması önemsiz bir şey olan xtürün y + zanlaşılmasıyla türetilir. Bunu yapmak için, a priori türleri yve zbilinmesi gerekir : bu, tür ek açıklamaları ile yapılabilir veya kendilerine atanan hazır bilgilerden çıkarılabilir.
Aksine, çoğu işlevsel dilde, değişkenlerin türünü türetmek için bir modül (veya çıkarım algoritması yerel ise işlev) içindeki tüm olası bilgileri kullanan tür çıkarımları vardır. Karmaşık çıkarım algoritmaları (Hindley-Milner gibi) genellikle sahnelerin arkasında bir tür tip birleşimi (biraz denklem çözme gibi) içerir. Örneğin, Haskell'de şöyle yazarsanız:
let x = y + z
Haskell, türü sadece xdeğil, aynı zamanda yve zsadece onlara ekleme yaptığınız gerçeğine dayanarak çıkarabilir . Bu durumda:
x :: Num a => a
y :: Num a => a
z :: Num a => a
(Buradaki küçük harf , C ++ gibi diğer dillerde genellikle "jenerik" olarak adlandırılan abir polimorfik türü belirtir . Num a =>Bölüm, tür desteğinin bir miktar ekleme kavramına sahip olduğunu gösteren bir kısıtlamadıra .)
İşte daha ilginç bir örnek: herhangi bir özyinelemeli fonksiyonun tanımlanmasına izin veren sabit nokta birleştirici:
let fix f = f (fix f)
Haskell derleyicisinin türünü hiçbir yerde fbelirtmediğimize veya türünü belirtmediğimize fixdikkat edin:
f :: t -> t
fix :: (t -> t) -> t
Bu diyor ki:
- Parametre
f, rastgele türden taynı türe kadar bir işlev olmalıdır t.
fix, bir tür parametresi alan t -> tve bir tür sonucu döndüren bir işlevdir t.
x,y,zaynıNum, Eric tipi ama hala olabilirIntegerler,Doublelar,Ratio Integers ... Haskell diğer typeclasses için sayısal türleri arasında keyfi bir seçim yapmak için istekli ama değil.