Tür sınıfları bu modele nasıl uyuyor?
Kısa cevap: Yapmıyorlar.
Bir dile zorlamalar, tip sınıfları veya ad-hoc polimorfizm için başka mekanizmalar eklediğinizde, karşılaştığınız ana tasarım tutarlılıktır .
Temel olarak, iyi yazılmış bir programın tek bir yorumu olması için tip sınıfı çözünürlüğün deterministik olduğundan emin olmanız gerekir. Örneğin, aynı kapsamda aynı kapsamda birden çok örnek verebilirseniz, bunun gibi belirsiz programlar yazabilirsiniz:
class Blah a where
blah : a -> String
instance Blah T where
blah _ = "Hello"
instance Blah T where
blah _ = "Goodbye"
v :: T = ...
main :: IO ()
main = print (blah v) -- does this print "Hello" or "Goodbye"?
Derleyicinin yaptığı örnek seçimine bağlı olarak, veya blah v
değerine eşit olabilir . Bu nedenle, bir programın anlamı, programın sözdizimi tarafından tam olarak belirlenmez, aksine derleyicinin yaptığı keyfi seçimlerden etkilenebilir."Hello"
"Goodbye"
Haskell'in bu soruna çözümü, her türün her tür sınıf için en fazla bir örneği olmasını istemektir. Bunu sağlamak için, örnek bildirimlere yalnızca en üst düzeyde izin verir ve ayrıca tüm bildirimleri global olarak görünür hale getirir. Bu şekilde, belirsiz bir örnek bildirimi yapılırsa derleyici her zaman bir hata sinyali verebilir.
Ancak, bildirimleri global olarak görünür kılmak anlambilimin kompozisyonunu bozar. Kurtarmak için yapabileceğiniz şey , programlama dili için ayrıntılı bir anlambilim sunmaktır - yani, Haskell programlarının daha iyi davranışlı, daha kompozisyonlu bir dile nasıl çevrileceğini gösterebilirsiniz.
Bu aslında daktilo türlerini derlemenin bir yolunu sunar - buna genellikle Haskell çevrelerinde "kanıt çevirisi" veya "sözlükten geçiş" denir ve çoğu Haskell derleyicisinin ilk aşamalarından biridir.
Tipler ayrıca programlama dili tasarımının saf tür teorisinden nasıl farklı olduğuna iyi bir örnektir. Tipik sınıflar gerçekten harika bir dil özelliğidir, ancak kanıt teorik açıdan oldukça kötü davranırlar. (Bu yüzden Agda'nın tipik sınıfları yoktur ve Coq neden onları sezgisel çıkarım altyapısının bir parçası yapar.)