Teoria kategorii dla informatyków/Wykład 11: Monady

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania

Ważną klasę kategorii tworzą takie, których obiektami są zbiory z pewną dodatkową strukturą algebraiczną, zaś morfizmami - funkcje, które tą strukturę zachowują. Takie kategorie moglibyśmy z powodzeniem nazwać kategoriami algebraicznymi nad 𝐒𝐞𝐭. Rozważania nad odpowiednią definicją algebraiczności doprowadzą nas do odkrycia ciekawej struktury kategoryjnej: monady, która jest niejako ukryta w każdym sprzężeniu między funktorami.


W poszukiwaniu kategorii algebraicznych

Z pewnością na kategorie algebraiczne nie nadają się wszystkie kategorie konkretne, które charakteryzują się tym, że posiadają funktor zapominania o kodziedzinie 𝐒𝐞𝐭 (Definicja 5.9). Nawet, gdybyśmy dodatkowo zażądali, aby tenże funktor zapominania G:𝐂𝐒𝐞𝐭 miał lewe sprzężenie FG, które wskazuje jak odbudować w sposób wolny zapomnianą strukturę, to sytuacja ciągle nie jest zadowalająca. Na przykład, funktor zapominania 𝐓𝐨𝐩𝐒𝐞𝐭 ma lewe sprzężenie, a my nie chcemy traktować 𝐓𝐨𝐩 jako kategorii algebraicznej. Ale stąd warto rozpocząć poszukiwania, gdyż wszelkie kategorie, od których oczekujemy algebraiczności, jak 𝐆𝐫𝐩 czy 𝐌𝐨𝐧, posiadają lewe sprzężenia do funktorów zapominania, które przypisują zbiorom odpowiednie algebry wolne.

Niech zatem F:𝐂𝐃 i G:𝐃𝐂 będą sprzężone: FG. Rozważmy funktor T:𝐂𝐂 będący złożeniem funktorów F i G: T=GF. Jedność η:1𝐂GF sprzężenia ma zatem typ 1T. Informacje o kojedności ε:FG1𝐃 również nietrudno zakodować w terminach funktora T, bowiem skoro ε:FG1, to εF:FGFF (przypomnijmy definicję: εF():=εF()), a co za tym idzie: GεF:GFGFGF. Transformacja GεF jest naturalna; jeśli oznaczymy ją jako μ, to dostajemy μ:TTT. Diagramy trójkątne charakteryzujące sprzężenie z Twierdzenia 9.3 dają nam następujące komutujące trójkąty:

Naturalność ε daje dodatkowo komutujący diagram (Zadanie Zadanie 11.1).

Widzimy więc, że po wprowadzeniu endofunktora T i prostym przekształceniu sprzężenia, od którego pochodzi, pojawiła się pewna struktura. Dobrze wyróżnić je definicją i dokładnie zbadać:


Definicja 11.1 [monada]

Monadą w kategorii 𝐂 nazywamy trójkę 𝕋=(T,η,μ), gdzie T:𝐂𝐂 jest funktorem, zaś η:1𝐂T i μ:TTT - tranformacjami naturalnymi takimi, że:
μμT=μTμ,
μηT=1=μTη,

tzn. takimi, że powyższe trzy diagramy komutują.


Uwaga
Dla sprzężenia FG, monada (GF,η,GηF) nazywa się monadą indukowaną przez FG. Jak każde pojęcie kategoryjne, monada ma swój odpowiednik dualny: komonadę. Każde sprzężenie indukuje komonadę (FG,ε,FηG).


Czy struktura monady 𝕋=(T,η,μ) nad kategorią 𝐂 zawsze pochodzi od pewnego sprzężenia? Zauważmy, że aby odpowiedzieć na to pytanie musimy przede wszystkim odnaleźć drugą kategorię 𝐃 i dwa funktory F:𝐂𝐃, G:𝐃𝐂, FG takie, że T=GF. Okazuje się, że odpowiedź jest pozytywna: każda monada pochodzi od pewnego sprzężenia, a tak naprawdę istnieje wiele sprzężeń indukujących daną monadę. Te sprzężenia tworzą oddzielną kategorię. My wskażemy obiekt końcowy tej kategorii.

Dla monady 𝕋=(T,η,μ) nad 𝐂 definiujemy 𝕋-algebrę jako parę (X,θ), gdzie X𝐂0, θ:TXX oraz:

Morfizmem 𝕋-algebr f:(X,θ)(Y,γ) jest morfizm f:XY𝐂1 taki, że poniższy diagram komutuje:

Kategorię 𝕋-algebr będziemy oznaczać 𝐂𝕋. Nazywamy ją od nazwisk odkrywców: kategorią Eilenberga - Moore'a. Zobaczmy, że istnieje naturalny funktor zapominania G𝕋:𝐂𝕋𝐂 definiowany jako:


G𝕋((X,θ)f(Y,γ)):=(XfY).

Z drugiej strony, dla dowolnego X𝐂0, para (TX,μX) jest tak zwaną wolną 𝕋-algebrą, oznaczaną jako F𝕋(X). Operacja F𝕋 rozszerza się do funktora F𝕋:𝐂𝐂𝕋, jeśli położymy:

F𝕋(f:XY):=Tf:(TX,μX)(TY,μY).

W Zadaniu 11.2 pokażemy, że (TX,μX) dla dowolnego X jest rzeczywiście algebrą, zaś w Zadaniu następnym nr 11.3 udowodnimy, że


Twierdzenie 11.2 [każda monada pochodzi od sprzężenia]

F𝕋G𝕋

Monada indukowana przez to sprzężenie jest monadą 𝕋.

Przykłady monad

  • Niech (P,) będzie częściowym porządkiem. Monadą nad P jest funkcja monotoniczna T:PP taka, że xTx oraz TTxTx dla dowolnego xP. (Te dwie nierówności wyrażają typu transformacji η i μ. Diagramy w definicji monady komutują, bo relacja jest przechodnia.) Powyższe zależności dla T implikują, że TxTTx, czyli TT=T. Funkcja T jest więc idempotentna i traktuje się ją zwykle jako operację domknięcia.
  • Kowariantny funktor potęgowy 𝒫:𝐒𝐞𝐭𝐒𝐞𝐭 indukuje monadę, gdzie ηX:X𝒫(X) jest zanurzeniem ηX(x)={x}, zaś mnożenie μX:𝒫𝒫(X)𝒫(X) jest sumą zbiorów: μX(𝒮)=α. Własności tej monady bardzo dobrze podsumowują teoriomnogościowe własności sumy w połączeniu z notacją {...} służącą do konstrukcji zbiorów. W Zadaniu 11.5 przedstawiamy dowód, że (𝒫,{},) jest monadą nad 𝐒𝐞𝐭. Identyczny dowód pokazuje, że 𝒫fin:𝐒𝐞𝐭fin𝐒𝐞𝐭fin (kowariantny funktor potęgowy na zbiorach skończonych) indukuje monadę nad 𝐒𝐞𝐭fin.
  • Niech (M,*,e) będzie monoidem. Funktor M×():𝐒𝐞𝐭𝐒𝐞𝐭 wraz z transformacjami naturalnymi ηX(x):=(e,x) oraz μX(m2*(m1,x)):=(m2*m1,x) definiuje monadę 𝕋. 𝕋-algebry to M-automaty, które poznaliśmy w Zadaniu 1.11. Szczegóły tej konstrukcji opisujemy w Zadaniu 11.6.
  • Funktor List:𝐒𝐞𝐭𝐌𝐨𝐧 z Przykładu 5.3 jest lewym sprzężeniem do funktora zapominania U:𝐌𝐨𝐧𝐒𝐞𝐭. Złożenie T=UF jest funktorem, który zbiorowi X przypisuje T(X) będący zbiorem skończonych słów nad X. Jedność jest oczywiście zanurzeniem elementu xX w listę jednoelementową [x]. Jak zdefiniować mnożenie w tej monadzie? Jako μ:TTXTX proponujemy transformację naturalną, która liście list:
[[x1,...,xn],[y1,...,ym],...,[z1,...,zl]]

przypisze listę:

[x1,...,xn,y1,...,ym,...,z1,...,zl].

Łatwo pokazać, że 𝕋=(T,η,μ) jest monadą nad 𝐒𝐞𝐭. Okazuje się, że kategoria 𝕋-algebr jest równoważna z kategorią monoidów 𝐌𝐨𝐧.

  • Rozważmy sprzężenie FG dla funktora wolnego F:𝐒𝐞𝐭𝐆𝐫𝐩 i funktora zapominania G:𝐆𝐫𝐩𝐒𝐞𝐭. Niech 𝕋 będzie monadą indukowaną przez to sprzężenie. A zatem T(X) jest zbiorem podkładowym wolnej grupy nad zbiorem X (czy Czytelnik pamięta z kursu algebry, jak taka grupa jest tworzona?). Jeśli (X,θ) jest 𝕋-algebrą, dostaniemy strukturę grupy na X, jeśli zdefiniujemy działanie jako xy:=θ(xy), gdzie xx jest włożeniem generatorów, tzn. ηX:XTX, ηX(x):=x, zaś xy jest mnożeniem w wolnej grupie nad X. Za pomocą tej konstrukcji dostajemy funktor 𝐒𝐞𝐭𝕋𝐆𝐫𝐩. Odwrotnie, jeśli G jest grupą, to homomorfizm fG:F(G)G, definiowany jako mnożenie liter słowa z F(G) za pomocą działania grupy G, daje wraz z G 𝕋-algebrę (G,fG), a zatem obiektową część funktora typu 𝐆𝐫𝐩𝐒𝐞𝐭𝕋. Uwaga! Para funktorów, których szkic konstrukcji pokazaliśmy, stanowi równoważność kategorii 𝐆𝐫𝐩 i 𝐒𝐞𝐭𝕋.


Dwa ostatnie przykłady wskazują nam to, czego szukaliśmy od początku wykładu: odpowiedzi na pytanie, jakie kategorie chcemy uważać za algebraiczne!

Uwaga
Slogan: Kategoria 𝐂 jest algebraiczna, jeśli jest równoważna kategorii 𝐒𝐞𝐭𝕋 dla pewnej monady 𝕋 nad 𝐒𝐞𝐭. W ten sposób algebraiczne są grupy, grupy abelowe, monoidy, pierścienie, algebry Boole'a, półkraty, zwarte przestrzenie Hausdorffa. Przykładem kategorii, która nie jest algebraiczna są zupełne algebry Boole'a.


Monady w Haskellu

Monady są wykorzystywane m.in. w funkcyjnym języku programowania Haskell. Struktura monady doskonale nadaje się do specyfikacji: (a) operacji wejścia/wyjścia; (b) wyłapywania wyjątków (takich jak np. dzielenie przez zero); (c) interfejsów graficznych. Formalnie, monada w Haskellu jest pewnym typem danych, bardzo czytelnie opisuje tę sytuację w przypadku monady I/O (wejścia/wyjścia) fragment wykładu Paradygmaty programowania. Tenże Haskellowy typ danych jest tak naprawdę inastancją klasy Monad. Ta klasa wyposażona jest zawsze w dwie funkcje: >>= i return:

class Monad m where return :: a -> m a (>>=) :: m a -> (a -> m b) -> m b

Funkcja return oczywiście pełni rolę jedności monady, zaś operacja >>= zawiera całą informację o funktorze indukującym monadę i mnożeniu. Dokładniej mówiąc, funktor indukujący monadę oznacza się jako:

map :: (t -> u) -> (M t -> M u),

zaś mnożenie monady jako:

join :: M(Mt) -> Mt.

Wtedy mamy następującą listę zależności pomiędzy tymi operacjami:

(map f) m jest tym samym, co: m >>= (\x -> return (f x)),

join m jest tym samym, co: m >>= (\x -> x),

m >>= f jest tym samym, co: join ((map f) m).