Як класи типів вписуються в цю модель?
Коротка відповідь: вони цього не роблять.
Кожного разу, коли ви впроваджуєте мову примусових класів, класів типів чи інших механізмів спеціального поліморфізму, головне питання дизайну, з яким ви стикаєтесь, - це узгодженість .
По суті, вам потрібно забезпечити, щоб роздільна здатність класу була детермінованою, щоб добре набрана програма мала єдину інтерпретацію. Наприклад, якщо ви могли б надати кілька екземплярів для одного типу в одному і тому ж обсязі, ви можете потенційно написати неоднозначні програми на зразок цієї:
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"?
Залежно від вибору примірника, який робить компілятор, blah v
може дорівнювати "Hello"
або "Goodbye"
. Отже, значення програми не було б повністю визначено синтаксисом програми, а, скоріше, може впливати довільний вибір, який робить компілятор.
Рішення цієї проблеми Haskell полягає в тому, щоб вимагати, щоб кожен тип мав щонайменше один екземпляр для кожного типу класу. Щоб забезпечити це, він дозволяє декларації екземплярів лише на верхньому рівні, а також робить усі декларації глобальними. Таким чином, компілятор завжди може подати помилку, якщо буде зроблено неоднозначне оголошення екземпляра.
Однак, декларування в глобальному масштабі порушує композиційність семантики. Що можна зробити, щоб відновити, - це надати розробок семантики для мови програмування - тобто ви можете показати, як перекласти програми Haskell на більш чудову, більш композиційну мову.
Це фактично дає вам змогу складати типові класи, а також - це зазвичай називається "переклад доказів" або "перехід словника" в колах Haskell і є одним з ранніх етапів більшості компіляторів Haskell.
Класові класи також є хорошим прикладом того, як дизайн мови програмування відрізняється від теорії чистого типу. Класові класи - це справді дивовижна особливість мови, але вони доволі недоброзичливі з доказово-теоретичної точки зору. (Ось чому Агда взагалі не має класів машинобудування, і чому Coq робить їх частиною своєї евристичної інфраструктури висновку.)