Cevap şimdiye kadar yanıltıcı.
"Parametrik" ve "ad-hoc aşırı yükleme" polimorfizmi arasında bir ayrım yapılması gerekmektedir. Parametrik, "tüm a türleri için aynı şekilde davranır" anlamına gelirken, "ad-hoc" - Simon'un polimorfik olarak adlandırdığı şey - uygulamayı türe göre değiştirir.
Her ikisine örnek olarak reverse :: [a] -> [a]
parametrik olan ve show :: Show a => a -> String
"ad-hoc" aşırı yüklenmiş olan örnek gösterilebilir.
Daha soyut bir sezgi istiyorsanız, "sahip olmak" veya "düşünmek" gibi nesneler için herhangi bir kısıtlama getirmeyen, ancak " açmak "dediğimiz şeylerin açılmasını gerektirir. Örneğin 'bir ağaç açmak' mantıklı değilken, 'bir kapı düşünebilirim' ve 'bir kapı açabilirim'. Örneği daha ileri götürmek, "açmak", "pencereyi açmak" ve "müşteri hizmetleriyle bir şikayet bileti açmak" gibi "geçici polimorfik" olmaktan çok farklı şeylerdir. Bu zorlanmış görünüyorsa - unutun! Benim için çalışıyor.
Ancak her ikisi de derleme zamanında çözümlenir ve aslında "silinir". Modülo çeşitli GHC uzantıları ve Şablon Haskell, vb Çeşitleri vardır aslında derleme zamanında silinip çalışma zamanında kontrol asla.
Parametrik olarak polimorfik fonksiyonlar tüm tipler için aynı şekilde davranır, bu nedenle derleyici belirli bir program noktasında hangi "tip-sınıflı" fonksiyon versiyonunun çalıştırılması gerektiğine karar verirken, sadece bir kod parçasının oluşturulması gerekir. Bu nedenle, tür sınıfı başına tür başına bir eşgörünümün ve karşılık gelen "newtype" çözümünün var olmasının nedeni de budur.
Uygulama, SPJ'ler ders kitabında ve Wadler ve Blotts yazı tiplerinde ayrıntılı olarak açıklanmıştır .
a -> String
. Daha büyük olasılıkla, bir tür kısıtlamanız olurShow a => a -> String
.