Математичний (категоричний) опис класів типів


14

Функціональну мову можна розглядати як категорію, де її об'єктами є типи, а між ними функціонують морфізми.

Як класи типів вписуються в цю модель?

Я припускаю, що ми повинні розглядати лише ті реалізації, які задовольняють обмеження, яке має більшість класів типів, але вони не виражені в Haskell. Наприклад, ми повинні розглядати лише ті реалізації, Functorдля яких fmap id ≡ idі fmap f . fmap g ≡ fmap (f . g).

Або є якісь інші теоретичні основи для типів класів (наприклад, на основі набраних лямбда-обчислень)?


1
Ви можете бути більш чіткими щодо того, для чого саме ви хочете модель. Якщо ви хочете щось, що може суворо описувати припущення відкритого світу, поведінку роздільної здатності екземпляра, взаємодію різних розширень GHC та ін., Це досить складніше, ніж ідеалізована версія. Аналогічно зауважте, що днища часто ігноруються при обговоренні Hask.
CA McCann

4
Класи типів можна розглядати як підписи (у сенсі універсальної алгебри). Колекція всіх об'єктів, що мають однаковий підпис (елементи одного класу типу), є різноманітною .
Дейв Кларк

1
@DaveClarke: Мені не відразу зрозуміло, як описати класи типу на вищих видах таким чином, але я не страшенно знайомий з універсальною алгеброю і, можливо, нерозумію відповідність, яку ви маєте на увазі ...
CA McCann

1
@camccann: Я не впевнений, наскільки далеко йде кореспонденція. Це, безумовно, здавалося гарним відправною точкою.
Дейв Кларк

2
@camccann: Просто змініть базову категорію, над якою ви визначаєте свою алгебру: базові класи типу типу num є підписи над категорією типів haskell (або об'єктами Hsk категорії), типи класів над конструкторами типу - це алгебри над категорією функторів від Хаска до Хаска. Зауважимо, що універсальна алгебра повністю підпадає під поняття алгебри в теорії категорій. Також: Дейв: ти повинен перетворити свій коментар у відповідь.
коді

Відповіді:


18

Як класи типів вписуються в цю модель?

Коротка відповідь: вони цього не роблять.

Кожного разу, коли ви впроваджуєте мову примусових класів, класів типів чи інших механізмів спеціального поліморфізму, головне питання дизайну, з яким ви стикаєтесь, - це узгодженість .

По суті, вам потрібно забезпечити, щоб роздільна здатність класу була детермінованою, щоб добре набрана програма мала єдину інтерпретацію. Наприклад, якщо ви могли б надати кілька екземплярів для одного типу в одному і тому ж обсязі, ви можете потенційно написати неоднозначні програми на зразок цієї:

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 робить їх частиною своєї евристичної інфраструктури висновку.)


що таке кандидат, який займає друге місце, який має денотаційну семантику iyswim?
Охад Каммар

1
Я не маю уявлення, на жаль.
Ніл Крішнасвамі

Чи заслуговує це додаткове запитання?
Охад Каммар

@NeelKrishnaswami: Чи маєте ви уявлення про те, як модулі ML підходять до цього? А як щодо модулів Agda (про які хтось мені згадував, що вони "першокласні")?
Лій

1
@Lii: Модулі ML та записи Agda набагато краще поводяться, але це занадто складно, щоб пояснити в коментарі - задайте питання про них, і я (або хтось інший) поясню.
Ніл Крішнасвамі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.