Чи корисна теорія категорій для вивчення функціонального програмування?


118

Я вивчаю Haskell і мене захоплює мова. Однак у мене немає серйозного математичного або CS курсу. Але я досвідчений програмний програміст.

Я хочу вивчити теорію категорій, щоб я міг стати кращим у Haskell.

Які теми в теорії категорій я повинен навчитися, щоб забезпечити хорошу основу для розуміння Хаскелла?



1
Я вдячний, що ви розрізняєте програмування та cs.
jmite

4
"Навчання теорії категорій, щоб стати кращим в Хаскеллі" - це щось на кшталт "Навчання фізиці, щоб стати кращим в тенісі"
user26756

Відповіді:


114

У попередній відповіді на сайті «Теоретична інформатика» я сказав, що теорія категорій є «основою» для теорії типів. Тут я хотів би сказати щось сильніше. Теорія категорій - це теорія типів . І навпаки, теорія типів - це теорія категорій . Дозвольте розкрити ці питання.

Теорія категорій - це теорія типів

У будь-якому типізованих формальній мові, і навіть в звичайних математики з використанням неформальної нотації, ми в кінці кінців оголошення функцій з типами . Наслідком у письмовій формі є ідея про те, що і це деякі речі, які називаються "типами", а - "функцією" від одного типу до іншого. Теорія категорій - це алгебраїчна теорія таких "типів" і "функцій". (Офіційно теорія категорій називає їх "об'єктами" та "морфізмами", щоб уникнути ступні на заданих теоретичних пальцях традиціоналістів, але все частіше я бачу теоретиків категорії, які кидають таку обережність на вітер і використовують більш інтуїтивні терміни: "тип "і" функція ". Але,A B ff:ABABf

Нас усіх виховували на теорії множин із середньої школи і далі. Отже, ми звикли думати про типи, такі як і як множини, та функції, такі як як множинно-теоретичні відображення. Якщо ви ніколи не думали про них так, ви в хорошій формі. Ви уникли теоретичного промивання мозку. Теорія категорій говорить про те, що існує багато типів і багато видів функцій. Отже, уявлення про типи як набори обмежує. Натомість теорія категорій аксіоматизує види та функції алгебраїчно. В основному, це те, що теорія категорій. Теорія типів та функцій. Це дійсно виходить досить складним, залучаючи високий рівень абстракції. Але, якщо ви зможете це навчитися, ви отримаєте глибоке розуміння типів та функцій.Б фABf

Теорія типів - теорія категорій

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

Історично Дана Скотт, можливо, першою зрозуміла це. Він працював над створенням семантичних моделей мов програмування на основі типізованого (і нетипового) обчислення лямбда. Традиційні теоретико-теоретичні моделі були недостатніми для цієї мети, оскільки мови програмування передбачають необмежену рекурсію, якої не вистачає теорії множин. Скотт винайшов серію смислових моделей, які фіксували явища програмування, і прийшов до усвідомлення того, що набране лямбда-числення точно представляє клас категорій, які називаються декартовими закритими категоріями . Існує багато декартових закритих категорій, які не є "теоретично заданими". Але набране лямбда-числення стосується всіх їх однаково. Скотт написав чудовий нарис під назвою " Зв’язані теорії обчислення лямбда""пояснення того, що відбувається, частини якого, здається, доступні в Інтернеті. Оригінальна стаття була опублікована в томі, який називався" До КВ Крі: Нариси комбінаційної логіки, обчислення лямбди та формалізму ", Academic Press, 1980. Беррі та Curien прийшов до такої ж реалізації, ймовірно, незалежно. Вони визначили категоричну абстрактну машину (CAM) для використання цих ідей у ​​реалізації функціональних мов, а мова, яку вони реалізували, отримала назву "CAML", що є основою F # Майкрософт .

Конструктори стандартного типу, такі як , , і т.д., - це функтори . Це означає, що вони не тільки відображають типи на типи, але й функціонують між типами на функції між типами. Поліморфні функції зберігають усі такі функції, що є результатом дії функтора. Теорія категорій була винайдена в 1950-х роках Ейленбергом і МакланомL i s t×Listсаме для формалізації поняття про поліморфні функції. Вони назвали їх "природними перетвореннями", "природними", оскільки вони є єдиними, які можна записати правильним типом, використовуючи змінні типу. Отже, можна сказати, що теорія категорій була винайдена саме для формалізації поліморфних мов програмування, ще до появи мов програмування!

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


Все сказане і зроблене, теорія категорій - це найбільш важлива математична теорія типів і функцій. Отже, всі програмісти можуть отримати користь від вивчення трохи теорії категорій, особливо функціональних програмістів. На жаль, не видається жодних підручників з теорії категорій, орієнтованих саме на програмістів. Книги "Теорія категорій для інформатики", як правило, орієнтовані на студентів / дослідників теоретичних інформатик. Книга Бенджаміна Пірса « Теорія базових категорій для вчених-комп'ютерів» , мабуть, найбільш читабельна з них.

Однак в Інтернеті є безліч ресурсів, які орієнтовані на програмістів. Сторінка Haskellwiki може стати хорошою відправною точкою. У аспірантурі Мідлендса ми маємо лекції з теорії категорій (серед інших). Курс Грем Хаттон був прив'язаний як курс для початківців, а мій - як "просунутий" курс. Але вони охоплюють по суті однаковий зміст, йдучи на різну глибину. Університет Чалмерс має приємну сторінку ресурсів про книги та конспекти лекцій з усього світу. Захоплений сайт блог «SIGFPE» також надає багато хороших інтуїтивні З точки зору програміста.

Основні теми, які ви хочете вивчити:

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

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

Чим більше ви знаєте математики, тим легше було б засвоїти теорію категорій. Оскільки теорія категорій - це загальна теорія математичних структур, корисно знати деякі приклади, щоб оцінити, що означають визначення. (Коли я вивчив теорію категорій, мені довелося скласти власні приклади, використовуючи моє знання семантики мови програмування, тому що в стандартних підручниках були лише математичні приклади, про які я нічого не знав.) Потім вийшла блискуча книга Ламбека і Скотт назвав " Вступ до категоричної логіки""яка пов’язана теорія категорій із системами типів (те, що вони називають" логікою "). Зараз можна зрозуміти теорію категорій, лише пов'язуючи її з системами типів, навіть не знаючи багатьох прикладів. Багато ресурсів, про які я згадував вище, використовують це підхід до пояснення теорії категорій.


3
@UdayReddy Я абсолютно не згоден з вашим ототожненням теорії категорій із теорією типів. Сучасна теорія типів по суті стосується типів для паралельних процесів, наприклад, теорія традиції типів сеансів. Наскільки мені відомо, категоричного розуміння подібних систем набору тексту немає.
Мартін Бергер

6
@MartinBerger Я думаю, що ваше тлумачення "теорії типів" трохи вузьке. Однак я погоджуюся, що правильне розуміння типів сеансів у теоретичному та категорично-теоретичному відношенні є гарною проблемою для дослідження, на яку я маю намір витратити час.
Удай Редді

2
@MartinBerger. Щоб побачити, як теорія категорій застосовується до більш багатих понять обчислення, я пропоную вам поглянути на те, як вона застосовується як до теорії імперативного програмування, так і до семантики ігор (що знову ж таки може досить добре кодувати імперативні обчислення). Отже, я не вірю, що функціональне програмування має монополію на теорію категорій.
Удай Редді

1
@nicolas, фібрації - це спосіб робити індексовані категорії, які моделюють залежні типи. Фібрації також можна розглядати як дуже загальну форму програмної логіки, де означає, що відображає -задовільні значення на -задовільні значення. f P Qf:PQfPQ
Удай Редді

2
"На жаль, не видається жодних підручників з теорії категорій, орієнтованих саме на програмістів". Така "текстова книга" тепер більш-менш існує в Теорії категорій для програмістів Бартоша Мілевського . Бартош також створив супровідну серію лекцій .
alx9r

30

Я спробую тримати це коротко і солодко. Між програмами Haskell та певними класами категорій існує неофіційна переписка, яку можна зробити більш офіційною за допомогою певної роботи. Це листування відоме як листування Кері-Говарда-Ламбека і стосується:

  1. Типи Haskell з об'єктами категорії
  2. Умови типу з морфізмами (зверніть увагу на подібні позначення)f : A BAB f:AB
  3. Алгебраїчні типи даних з початковими об'єктами
  4. Тип конструкторів з функторами
  5. тощо

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

Я не впевнений, яку книгу рекомендувати, оскільки я не знайшов цілком задовільної вступної книги про категорії для вчених-комп'ютерів. Ви можете спробувати Категорії, типи та структури від Asperti та Longo. Ідея полягає в тому, щоб вивчити основні визначення аж до доповнень, а потім, можливо, спробувати і прочитати деякі чудові блоги там, щоб спробувати і зрозуміти ці поняття.


1
"придумайте поняття, які корисні і математикам, але і поширені в практиці програмування Haskell" - ви можете навести приклад, чи це вимагатиме занадто багато попередніх знань?
Рафаель

7
@ Рафаель: Монади. Стрілки. Алгебри. Вугілля.
Дейв Кларк

6
Функтори, подвійність, категорія Клейслі, лемма Йонеда ...
cody

4
Декартові закриті категорії. Заготівля.
Дейв Кларк

2
"Вступ до теорії категорій для інженерів програмного забезпечення", cs.toronto.edu/~sme/presentations/cat101.pdf
Володимир Алексієв

29

Наголошуючи поради @AJed, рекомендую переключити вашу заяву

I want to learn category theory so I can become better at Haskell.

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

Теорія категорій проста для тих, хто має широку математичну освіту (групи, кільця, модулі, векторні простори, топологія тощо). Відсутній цей фон, теорія категорій майже непроникна. Краса теорії категорій полягає в тому, що вона об'єднує безліч начебто неспоріднених речей (наприклад, ліві прилягання забудькуваних функторів включають вільні групи, універсальні обволікаючі алгебри, ущільнення Stone-Cech, абелянізації груп, ...) і так зменшує складність. Але якщо ви не знайомі з численними прикладами, з якими уніфікується теорія категорій, теорія категорій - це лише додатковий рівень складності, який ускладнює ваше життя.

На мій досвід, навчання простіше, спираючись на речі, які вже знають. Як розробник програмного забезпечення, ви багато чого знаєте про програмування, а програмування Haskell не так відрізняється від інших програмувань, тому моя рекомендація - підходити до Haskell з точки зору прагматичного програмування, ігноруючи теорію категорій. Теорія категорій, що є в Haskell, наприклад, деяка підтримка монад, програмісту зрозуміти набагато простіше, не обходячись теорією категорій. Зрештою, монади - це просто узагальнений склад (і ви вже використовували монади у своїй програмувальній практиці - хоч і не знаючи, що ви це зробили), і Haskell насправді не підтримує монади справжніми, оскільки не виконує монадійні закони.


7
Ні, якщо чесно сказати, Haskell насправді полягає в тому, що він відрізняється від більшості інших мов програмування до того, що найчастіше найбільшим викликом стає попереднє заздалегідь уявлення. Здається, досвідчені розробники програмного забезпечення мають більше проблем, ніж люди, які ніколи раніше не програмували.
CA McCann

5
@CAMcCann Я погоджуюся, що деякі досвідчені програми важко переходять, наприклад, від Java або C # до Haskell, але я не думаю, що це є щось принципово інше в Haskell. Я думаю, що це частково тому, що воно, здається, відрізняється. Ідея, що вам потрібно вивчити теорію категорій, щоб оцінити Haskell, ймовірно, завадила досить багатьом досвідченим розробникам програмного забезпечення досягти майстерності Haskell. (Порівнюйте, чому у F # немає монад.) Мені, звичайно, важко придумати багато функцій Haskell, які також не мають подібності до інших мов.
Мартін Бергер

5
Знання теорії категорій може трохи допомогти, але не все так багато, і вивчити це , безумовно, набагато складніше, ніж вивчити Haskell. Існують досить принципові відмінності порівняно з більшістю мов (чистота, неточне оцінювання, система типів), і видалення всіх термінів CT не робить їх більш звичними. З іншого боку, навчання Haskell мотивує деяких людей освоїти деякі КТ, оскільки позичені ідеї корисні . Система обмеженого типу F # та уникнення ідеально хорошого існуючого терміна - це недоліки, а не особливості.
CA McCann

1
Я не знаю жодної мови, крім Scala, із системою типів, дійсно порівнянною з Haskell. З емпіричного спостереження чистоту не відразу розуміють, а не сувора оцінка (яку ви пропустили) ще складніше. Нарешті, я являюсь робочим програмістом , і я сперечаюся , що хто - небудь в поле збирається бути залякати ім'ям . Індустрія розробки програмного забезпечення вже наповнена непрозорим жаргоном. Також система типів F # не може безпосередньо виражати монади - обчислювальні вирази не першого класу, що значно обмежує їх використання.
CA McCann

2
CBN також є концептуально простим, наприклад, за аналогією з громом, концепцією, яку використовували більшість працюючих програмістів раніше. Чистота - це те, що розуміє кожен працюючий програміст. Haskell використовується в бакалавраті у Великобританії. Коли мої студенти запитують мене, як увійти в функціональне програмування, я часто рекомендую спочатку вивчити Haskell, але студентів залякує його репутація, як це було джерелом питання. Я вважаю, що головна причина цього - асоціація Хаскелла з теорією категорій.
Мартін Бергер

13

Коротка відповідь: ні [але це лише думка]

Не переходьте до Теорії категорій чи будь-якого іншого теоретичного домену, щоб стати хорошим у Haskell. Вивчіть функціональні методи програмування, такі як рекурсія хвоста, карта, зменшення та інші. Прочитайте якомога більше коду. Втіліть якомога більше ідей. Якщо у вас є проблеми, читайте і читайте.

Якщо ви хочете отримати хороші теоретичні довідки щодо вивчення Хаскелл та інших функціональних парадигм програмування, то подивіться: Вступ до функціонального програмування через обчислення Лембди, Грег Майклсон (доступний в Інтернеті). ... Є й інші подібні книги.


1
Я піднімаю брову на це, тому що "рекурсія хвоста" зазвичай не важлива для програмування в Haskell через лінь. Тим не менш, "вчитися на практиці" майже завжди є хорошою порадою.
Дан Бертон

@DanBurton .. цікаве спостереження. Скажімо, тоді замість Haskell вивчіть erlang або схему :). [Я не фахівець з Haskell, я просто вибрав це, бо це звучить круто]
AJed


0

Теорія категорій - це дуже складна галузь математики, і оволодіння нею уніфікує більшість попередніх знань, зробивши їх екземплярами одних і тих же абстрактних об'єктів. Тож це дуже корисно і дуже інтуїтивно. Але це величезна і широка, і ви опинитеся в безлічі нових концепцій, які навіть не знають, яка з них підходить для ваших потреб і яку з них слід пропустити. Отже, ваш цілеспрямований підхід потребує вибору серед понять, інакше освоєння цього неминуче потребує тривалого часу і насправді не є власною наукою.

До речі, я пропоную дуже вдало почати для вашої мети бути тут .


Це насправді не відповідає на питання: чи корисне це для вивчення функціонального програмування? Які теми в теорії категорій корисні для Haskell?
Девід Річербі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.