Czy teoria kategorii jest przydatna do nauki programowania funkcjonalnego?


118

Uczę się języka Haskell i fascynuje mnie język. Nie mam jednak żadnego poważnego doświadczenia matematycznego ani CS. Ale jestem doświadczonym programistą.

Chcę nauczyć się teorii kategorii, abym mógł stać się lepszy w Haskell.

Których tematów z teorii kategorii powinienem nauczyć się zapewniać dobrą podstawę do zrozumienia Haskell?



1
Rozumiem, że rozróżniasz programowanie i cs.
jmite

4
„Teoria kategorii uczenia się, aby stać się lepszym w Haskell” przypomina trochę „Nauczenie się fizyki, aby stać się lepsza w tenisie”
26756

Odpowiedzi:


114

W poprzedniej odpowiedzi na stronie Theoretical Computer Science powiedziałem, że teoria kategorii jest „podstawą” teorii typów. Tutaj chciałbym powiedzieć coś mocniejszego. Teoria kategorii to teoria typów . I odwrotnie, teoria typów jest teorią kategorii . Pozwól mi rozwinąć te kwestie.

Teoria kategorii to teoria typów

f:ABABf

ABf

Teoria typów to teoria kategorii

Przez „teorię typów” rozumiem dowolny formalny język pisany na maszynie, oparty na sztywnych regułach formowania terminów, które zapewniają, że wszystko sprawdza typ. Okazuje się, że ilekroć pracujemy w takim języku, pracujemy w strukturze teoretycznej. Nawet jeśli używamy notacji teoretycznych i myślimy teoretycznie, to ostatecznie piszemy rzeczy, które mają sens kategorycznie. To niesamowity fakt .

Historycznie Dana Scott mogła być pierwszą, która to zauważyła. Pracował nad produkcją modeli semantycznych języków programowania na podstawie typowego (i nietypowego) rachunku lambda. Tradycyjne modele teoretyczne nie były odpowiednie do tego celu, ponieważ języki programowania wiążą się z nieograniczoną rekurencją, której brakuje w teorii. Scott wynalazł serię modeli semantycznych, które uchwyciły zjawiska programowania i doszedł do wniosku, że typowany rachunek lambda dokładnie reprezentuje klasę zwaną kartezjańską kategorią zamkniętą . Istnieje wiele kartezjańskich zamkniętych kategorii, które nie są „teoretyczne”. Ale wpisany rachunek lambda stosuje się do nich wszystkich jednakowo. Scott napisał fajny esej zatytułowany „ Powiązane teorie rachunku lambda„wyjaśniając, co się dzieje, a niektóre z nich wydają się być dostępne w Internecie. Oryginalny artykuł został opublikowany w tomie zatytułowanym„ Do HB Curry: eseje na temat logiki kombinowanej, rachunku lambda i formalizmu ”, Academic Press, 1980. Berry i Curien doszedł do tej samej realizacji, prawdopodobnie niezależnie. Zdefiniowali kategoryczną abstrakcyjną maszynę (CAM) do wykorzystania tych pomysłów w implementacji języków funkcjonalnych, a język, który zaimplementowali, nazwano „CAML”, który stanowi podstawę F # Microsoftu .

×Listwłaśnie w celu sformalizowania koncepcji funkcji polimorficznych. Nazwali je „naturalnymi transformacjami”, „naturalnymi”, ponieważ są jedynymi, które można pisać w sposób poprawny dla typu, używając zmiennych typu. Można więc powiedzieć, że teoria kategorii została wymyślona właśnie w celu sformalizowania polimorficznych języków programowania, jeszcze zanim powstały języki programowania!

Tradycjonalista z zestawu teorii nie ma wiedzy o funktorach i naturalnych przekształceniach zachodzących pod powierzchnią, gdy używa notacji z zestawu teorii. Ale tak długo, jak wiernie używa systemu czcionek, tak naprawdę robi konstrukcje kategoryczne, nie będąc ich świadomym.


Wszystko powiedziane i zrobione, teoria kategorii jest kwintesencją matematycznej teorii typów i funkcji. Wszyscy programiści mogą więc skorzystać z nauki teorii kategorii, szczególnie programiści funkcjonalni. Niestety wydaje się, że nie ma żadnych podręczników dotyczących teorii kategorii skierowanych specjalnie do programistów. Książki „teoria kategorii dla informatyki” są zazwyczaj skierowane do studentów / badaczy informatyki teoretycznej. Książka Benjamina Pierce'a, Podstawowa teoria kategorii dla informatyków jest chyba najbardziej czytelna z nich.

Istnieje jednak wiele zasobów w sieci, które są przeznaczone dla programistów. Strona Haskellwiki może być dobrym punktem wyjścia. W Midlands Graduate School prowadzimy wykłady z teorii kategorii (między innymi). Kurs Grahama Huttona został ustalony jako kurs „dla początkujących”, a mój jako kurs „zaawansowany”. Ale oba obejmują zasadniczo tę samą treść, przechodząc do różnych głębokości. University of Chalmers ma ładną stronę z zasobami na temat książek i notatek z wykładów z całego świata. Entuzjastyczny site blog „SIGFPE” zapewnia również wiele dobrych przeczuć z punktu widzenia programisty.

Podstawowe tematy, których chcesz się nauczyć, to:

  • definicja kategorii i kilka przykładów kategorii
  • funktory i ich przykłady
  • naturalne transformacje i ich przykłady
  • definicje produktów, koproduktów i wykładników (przestrzenie funkcji), obiektów początkowych i końcowych.
  • adiunkcje
  • kategorie monady, algebry i Kleisli

Moje notatki z wykładów w Midlands Graduate School obejmują wszystkie te tematy z wyjątkiem ostatniego (monady). Obecnie dostępnych jest wiele innych zasobów dla monad. To nie jest duża strata.

Im więcej matematyki znasz, tym łatwiej będzie nauczyć się teorii kategorii. Ponieważ teoria kategorii jest ogólną teorią struktur matematycznych, pomocne jest poznanie niektórych przykładów, aby docenić znaczenie definicji. (Kiedy nauczyłem się teorii kategorii, musiałem tworzyć własne przykłady, wykorzystując swoją wiedzę na temat semantyki języka programowania, ponieważ standardowe podręczniki zawierały tylko przykłady matematyczne, o których nic nie wiedziałem.) Potem pojawiła się genialna książka Lambka i Scott nazwał „ Wprowadzenie do logiki kategorycznej„którą powiązaną teorię kategorii z systemami typów (co nazywają„ logiką ”). Można teraz zrozumieć teorię kategorii po prostu przez powiązanie jej z systemami typów nawet bez znajomości wielu przykładów. Wiele zasobów, o których wspomniałem powyżej, korzysta z tego podejście do wyjaśnienia teorii kategorii.


3
@UdayReddy Zdecydowanie nie zgadzam się z twoją identyfikacją teorii kategorii z teorią typów. Współczesna teoria typów opiera się głównie na typach procesów współbieżności, np. Tradycja teorii typów sesji. Według mojej najlepszej wiedzy nie ma kategorycznego zrozumienia takich systemów pisania.
Martin Berger,

6
@MartinBerger Myślę, że twoja interpretacja „teorii typów” jest nieco wąska. Zgadzam się jednak, że właściwe zrozumienie typów sesji i teorii typów jest obecnie dobrym wyzwaniem badawczym, nad którym zamierzam spędzać czas.
Uday Reddy

2
@MartinBerger. Aby zobaczyć, jak teoria kategorii ma zastosowanie do bogatszych pojęć obliczeniowych, zapraszam do przyjrzenia się, w jaki sposób została ona zastosowana do teorii programowania imperatywnego i semantyki gier (która znowu może dość dobrze kodować obliczenia imperatywne). Nie wierzę więc, że programowanie funkcjonalne ma monopol na teorię kategorii.
Uday Reddy,

1
f:PQfPQ

2
„Niestety, wydaje się, że nie ma żadnych podręczników dotyczących teorii kategorii skierowanych specjalnie do programistów”. Taki „podręcznik” istnieje teraz mniej więcej w „Teorii kategorii dla programistów” Bartosza Milewskiego . Bartosz stworzył także cykl wykładów towarzyszących .
alx9r

30

Postaram się, aby było to krótkie i słodkie. Istnieje nieformalna korespondencja między programami Haskell a niektórymi klasami kategorii, która może być bardziej formalna przy pewnej pracy. Ta korespondencja jest znana jako korespondencja Curry-Howard-Lambek i dotyczy:

  1. Typy Haskella z obiektami kategorii
  2. AB f:AB
  3. Algebraiczne typy danych z obiektami początkowymi
  4. Pisz konstruktory z funktorami
  5. itp

Lista jest długa, ale jednym z kluczowych punktów jest to, że możesz definiować takie rzeczy jak monady i algebry w teorii kategorii i wymyślać pojęcia, które są przydatne zarówno matematykom, jak i są wszechobecne w praktyce programowania Haskell.

Nie jestem pewien, którą książkę polecić, ponieważ nie znalazłem całkowicie zadowalającej książki wprowadzającej na temat kategorii dla informatyków. Możesz wypróbować kategorie, typy i struktury autorstwa Asperti i Longo. Chodzi o to, aby nauczyć się podstawowych definicji aż do adiunkcji, a następnie może spróbować przeczytać kilka doskonałych blogów, aby spróbować zrozumieć te pojęcia.


1
„wymyślić pojęcia przydatne zarówno matematykom, jak i wszechobecne w praktyce programowania Haskell” - czy możesz podać przykład, czy wymagałoby to zbyt dużej wiedzy?
Raphael

7
@Raphael: Monads. Strzały Algebry. Coalgebras.
Dave Clarke

6
Functors, dwoistość, kategoria Kleisli, lemat Yoneda ...
cody

4
Zamknięte kategorie kartezji. Curry
Dave Clarke,

2
„Wprowadzenie do teorii kategorii dla inżynierów oprogramowania”, cs.toronto.edu/~sme/presentations/cat101.pdf
Vladimir Alexiev

29

Nawiązując do porady @AJed, zalecam odwrócenie swojego oświadczenia

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

na głowie: naucz się Haskell, bazując na intuicji programistycznej. Gdy jesteś guru FP, łatwiej jest podnieść teorię kategorii (jeśli nadal ci zależy).

Teoria kategorii jest prosta dla osób z szerokim wykształceniem matematycznym (grupy, pierścienie, moduły, przestrzenie wektorowe, topologia itp.). Bez tego tła teoria kategorii jest prawie nieprzenikniona. Piękno teorii kategorii polega na tym, że jednoczy ona wiele pozornie niezwiązanych ze sobą rzeczy (np. Lewe punkty zapominających funktorów obejmują wolne grupy, uniwersalne algebry otaczające, kompaktacje Stone-Cech, abelianizacje grup, ...), a zatem zmniejsza złożoność. Ale jeśli nie znasz wielu przykładów, które łączą teorię kategorii, teoria kategorii jest tylko dodatkową warstwą złożoności, która utrudnia twoje życie.

Z mojego doświadczenia wynika, że ​​uczenie się jest łatwiejsze dzięki wykorzystaniu wiedzy, którą już znasz. Jako programista dużo wiesz o programowaniu, a programowanie w Haskell nie różni się tak bardzo od innych programów, więc zalecam podejście do Haskella z pragmatycznego punktu widzenia programowania, ignorując teorię kategorii. Trochę teorii kategorii, która znajduje się w Haskell, np. Pewne wsparcie dla monad, jest znacznie łatwiejsze dla programisty, aby uchwycić go bez objazdu przez teorię kategorii. W końcu monady są jedynie uogólnioną kompozycją (i już używałeś monad w swojej praktyce programistycznej - choć nie wiedząc, że tak robiłeś), a Haskell tak naprawdę nie wspiera monad, ponieważ nie egzekwuje praw monadycznych.


7
Nie, szczerze mówiąc Haskell naprawdę jest , że różni się od większości innych języków programowania, do tego stopnia, że coraz przeszłości wcześniej pojęcia jest często największym wyzwaniem. Doświadczeni programiści wydają się mieć więcej problemów niż ludzie, którzy nigdy wcześniej nie programowali.
CA McCann,

5
@CAMcCann Zgadzam się, że niektórym doświadczonym programom trudno jest przejść z np. Java lub C # na Haskell, ale nie sądzę, że dzieje się tak, ponieważ w Haskell jest coś zupełnie innego. Myślę, że częściowo dlatego, że wydaje się być inny. Pomysł, że musisz nauczyć się teorii kategorii, aby docenić Haskell, prawdopodobnie uniemożliwił wielu doświadczonym programistom osiągnięcie mistrzostwa w Haskell. (Por. Dlaczego F # nie ma monad.) Z pewnością trudno mi pomyśleć o wielu funkcjach Haskell, które również nie są podobne w innych językach.
Martin Berger,

5
Znajomość teorii kategorii może trochę pomóc, ale nie aż tak bardzo, a nauka jej jest z pewnością znacznie trudniejsza niż nauka Haskella. Istnieją dość fundamentalne różnice w porównaniu do większości języków (czystość, brak ścisłej oceny, system typów), a usunięcie wszystkich terminów CT nie czyni ich bardziej znanymi. Z drugiej strony nauka Haskell motywuje niektórych ludzi do nauki CT, ponieważ pożyczone pomysły są przydatne . Ograniczony system F # i unikanie doskonale dobrego istniejącego terminu to wady, a nie cechy.
CA McCann,

1
Nie znam żadnego innego języka niż Scala z systemem typów naprawdę porównywalnym z językiem Haskella. Z obserwacji empirycznych czystość nie jest od razu pojmowana, a nieścisła ocena (którą pominięto) jest jeszcze trudniejsza. Wreszcie jestem pracującym programistą i zaprzeczam, że ktoś w tej dziedzinie będzie zastraszany przez imię . Branża tworzenia oprogramowania jest już pełna nieprzejrzystego żargonu. Ponadto system typów F # nie może bezpośrednio wyrażać monad - wyrażenia obliczeniowe nie są pierwszej klasy, co znacznie ogranicza ich użycie.
CA McCann,

2
CBN jest również koncepcyjnie łatwy, na przykład przez analogię z thunkingiem, koncepcją, z której wcześniej korzystało większość pracujących programistów. Czystość jest czymś, co rozumie każdy pracujący programista. Haskell jest używany w edukacji licencjackiej w Wielkiej Brytanii. Kiedy moi uczniowie pytają mnie, jak dostać się do programowania funkcjonalnego, często zalecam najpierw naukę języka Haskell, ale studenci są zastraszani jego reputacją, tak jak i pomysłodawca pytania. Uważam, że głównym tego powodem jest związek Haskella z teorią kategorii.
Martin Berger,

13

Krótka odpowiedź: nie [ale to tylko opinia]

Nie idź do teorii kategorii ani żadnej innej dziedziny teoretycznej, aby stać się dobrym w Haskell. Naucz się funkcjonalnych technik programowania, takich jak rekurencja ogona, mapa, redukcja i inne. Przeczytaj jak najwięcej kodu. Wdrożyć jak najwięcej pomysłów. Jeśli masz problemy, czytaj i czytaj.

Jeśli chcesz mieć dobre odniesienie teoretyczne do nauki Haskella i innych paradygmatów programowania funkcjonalnego, spójrz na: Wprowadzenie do programowania funkcjonalnego za pomocą rachunku lambda, Greg Michaelson (dostępny online). ... Istnieją inne podobne książki.


1
Unoszę brew, ponieważ „rekurencja ogona” zwykle nie jest ważna dla programowania w Haskell z powodu lenistwa. Niemniej jednak „ucz się przez działanie” jest prawie zawsze dobrą radą.
Dan Burton

@DanBurton .. ciekawa obserwacja. Powiedzmy zatem, zamiast Haskell, naucz się erlang lub knuj :). [Nie jestem ekspertem w Haskell, właśnie go wybrałem, ponieważ brzmi fajnie]
AJed


0

Teoria kategorii jest bardzo wyrafinowaną gałęzią matematyki, a jej opanowanie zjednoczy większość twoich wcześniejszych nauk, czyniąc z nich instancje tych samych abstrakcyjnych obiektów. Jest to więc bardzo przydatne i bardzo intuicyjne. Ale jest rozległa i szeroka, a znajdziesz wiele nowych koncepcji, które nawet nie będą wiedziały, która jest odpowiednia dla twoich potrzeb, a którą należy pominąć. Więc twoje celowe podejście wymaga wyboru między pojęciami, w przeciwnym razie opanowanie go nieuchronnie wymaga długiego czasu i tak naprawdę nie jest domeną samokształcenia.

Nawiasem mówiąc, proponuję bardzo dobry punkt wyjścia, aby twój cel był tutaj .


To tak naprawdę nie odpowiada na pytanie: czy jest przydatne do nauki programowania funkcjonalnego? Które tematy teorii kategorii są przydatne dla Haskell?
David Richerby,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.