Bagaimana kelas tipe cocok dengan model ini?
Jawaban singkatnya adalah: tidak.
Setiap kali Anda memperkenalkan paksaan, mengetik kelas, atau mekanisme lain untuk polimorfisme ad-hoc ke dalam bahasa, masalah desain utama yang Anda hadapi adalah koherensi .
Pada dasarnya, Anda perlu memastikan bahwa resolusi typeclass adalah deterministik, sehingga program yang diketik dengan baik memiliki interpretasi tunggal. Misalnya, jika Anda bisa memberikan beberapa instance untuk tipe yang sama dalam cakupan yang sama, Anda berpotensi menulis program ambigu seperti ini:
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"?
Bergantung pada pilihan contoh yang dibuat oleh kompiler, blah v
dapat sama dengan "Hello"
atau "Goodbye"
. Oleh karena itu, arti dari suatu program tidak akan sepenuhnya ditentukan oleh sintaks program, tetapi lebih dapat dipengaruhi oleh pilihan sewenang-wenang yang dibuat oleh kompiler.
Solusi Haskell untuk masalah ini adalah mengharuskan setiap tipe memiliki paling banyak satu instance untuk setiap typeclass. Untuk memastikan hal ini, ia mengizinkan deklarasi instance hanya di tingkat atas, dan selanjutnya membuat semua deklarasi terlihat secara global. Dengan begitu, kompiler selalu dapat memberi sinyal kesalahan jika deklarasi instance ambigu dibuat.
Namun, membuat deklarasi terlihat secara global merusak komposisionalitas semantik. Apa yang dapat Anda lakukan untuk memulihkan adalah memberikan semantik elaborasi untuk bahasa pemrograman - yaitu, Anda dapat menunjukkan cara menerjemahkan program Haskell ke dalam bahasa yang berperilaku lebih baik, lebih komposisional.
Ini sebenarnya memberi Anda cara untuk mengkompilasi kacamata ketik - juga biasanya disebut "terjemahan bukti" atau "transformasi kamus-lewat" di lingkaran Haskell, dan merupakan salah satu tahap awal dari kebanyakan kompiler Haskell.
Typeclasses juga merupakan contoh yang baik tentang bagaimana desain bahasa pemrograman berbeda dari teori tipe murni. Typeclasses adalah fitur bahasa yang benar-benar luar biasa, tetapi mereka cukup berperilaku buruk dari sudut pandang teori bukti. (Inilah sebabnya mengapa Agda tidak memiliki kacamata ketik sama sekali, dan mengapa Coq menjadikannya bagian dari infrastruktur inferensi heuristiknya.)