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 x
türün y + z
anlaşılmasıyla türetilir. Bunu yapmak için, a priori türleri y
ve z
bilinmesi 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 x
değil, aynı zamanda y
ve z
sadece 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 a
bir 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 f
belirtmediğimize veya türünü belirtmediğimize fix
dikkat edin:
f :: t -> t
fix :: (t -> t) -> t
Bu diyor ki:
- Parametre
f
, rastgele türden t
aynı türe kadar bir işlev olmalıdır t
.
fix
, bir tür parametresi alan t -> t
ve bir tür sonucu döndüren bir işlevdir t
.
x
,y
,z
aynıNum
, Eric tipi ama hala olabilirInteger
ler,Double
lar,Ratio Integer
s ... Haskell diğer typeclasses için sayısal türleri arasında keyfi bir seçim yapmak için istekli ama değil.