Haskell und Kategorientheorie - Informatik - Universität Bonn
Haskell und Kategorientheorie - Informatik - Universität Bonn
Haskell und Kategorientheorie - Informatik - Universität Bonn
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
Gemeinsamkeiten <strong>und</strong> Unterschiede<br />
Stefan Mehner<br />
Institut für <strong>Informatik</strong> III<br />
<strong>Universität</strong> <strong>Bonn</strong><br />
11.12.12<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Gliederung<br />
1 Monaden<br />
Warum?<br />
Monaden sind Funktoren mit Zusatz<br />
2 Kategorien<br />
Motivation <strong>und</strong> Definition<br />
Beispiele<br />
In <strong>Haskell</strong>?<br />
3 Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Natürliche Transformationen<br />
Adjungierte Funktoren<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Warum?<br />
Gliederung<br />
1 Monaden<br />
Warum?<br />
Monaden sind Funktoren mit Zusatz<br />
2 Kategorien<br />
Motivation <strong>und</strong> Definition<br />
Beispiele<br />
In <strong>Haskell</strong>?<br />
3 Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Natürliche Transformationen<br />
Adjungierte Funktoren<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Warum?<br />
Ein »= sie zu binden<br />
Was soll das?<br />
(»=) :: forall a b. m a -> (a -> m b) -> m b<br />
Und warum mit diesen Eigenschaften:<br />
return a »= k == k a<br />
m »= return == m<br />
m »= (\ x -> k x »= h) == (m »= k) »= h?<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Warum?<br />
Ein »= sie zu binden<br />
Was soll das?<br />
(»=) :: forall a b. m a -> (a -> m b) -> m b<br />
Und warum mit diesen Eigenschaften:<br />
return a »= k == k a<br />
m »= return == m<br />
m »= (\ x -> k x »= h) == (m »= k) »= h?<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Warum?<br />
Konvention<br />
Statt<br />
(»=) :: forall a b. m a -> (a -> m b) -> m b<br />
ab jetzt<br />
(=«) :: forall a b. (a -> m b) -> m a -> m b<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Warum?<br />
Verwandte Funktionen<br />
(=«) :: (a -> [b]) -> [a] -> [b]<br />
Wir kennen die Applikation:<br />
(a -> b) -> a -> b<br />
Insbesondere:<br />
(a -> [b]) -> a -> [b]<br />
Die Funktion map...<br />
(a -> b ) -> [a] -> [b]<br />
...die man auch so benutzen kann:<br />
(a -> [b]) -> [a] -> [[b]]<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Warum?<br />
Verwandte Funktionen<br />
(=«) :: (a -> [b]) -> [a] -> [b]<br />
Wir kennen die Applikation:<br />
(a -> b) -> a -> b<br />
Insbesondere:<br />
(a -> [b]) -> a -> [b]<br />
Die Funktion map...<br />
(a -> b ) -> [a] -> [b]<br />
...die man auch so benutzen kann:<br />
(a -> [b]) -> [a] -> [[b]]<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Warum?<br />
Verwandte Funktionen<br />
(=«) :: (a -> [b]) -> [a] -> [b]<br />
Wir kennen die Applikation:<br />
(a -> b) -> a -> b<br />
Insbesondere:<br />
(a -> [b]) -> a -> [b]<br />
Die Funktion map...<br />
(a -> b ) -> [a] -> [b]<br />
...die man auch so benutzen kann:<br />
(a -> [b]) -> [a] -> [[b]]<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Warum?<br />
Verwandte Funktionen<br />
(=«) :: (a -> [b]) -> [a] -> [b]<br />
Wir kennen die Applikation:<br />
(a -> b) -> a -> b<br />
Insbesondere:<br />
(a -> [b]) -> a -> [b]<br />
Die Funktion map...<br />
(a -> b ) -> [a] -> [b]<br />
...die man auch so benutzen kann:<br />
(a -> [b]) -> [a] -> [[b]]<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Warum?<br />
Verwandte Funktionen<br />
(=«) :: (a -> [b]) -> [a] -> [b]<br />
Wir kennen die Applikation:<br />
(a -> b) -> a -> b<br />
Insbesondere:<br />
(a -> [b]) -> a -> [b]<br />
Die Funktion map...<br />
(a -> b ) -> [a] -> [b]<br />
...die man auch so benutzen kann:<br />
(a -> [b]) -> [a] -> [[b]]<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Warum?<br />
Verwandte Funktionen<br />
Wir brauchen: (=«) :: (a -> [b]) -> [a] -> [b]<br />
Wir haben: (a -> [b]) -> [a] -> [[b]]<br />
Idee: Verkette mit concat :: [[b]] -> [b]<br />
Oder verwende direkt concatMap :: (a -> [b]) -><br />
[a] -> [b]<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Warum?<br />
Verwandte Funktionen<br />
Wir brauchen: (=«) :: (a -> [b]) -> [a] -> [b]<br />
Wir haben: (a -> [b]) -> [a] -> [[b]]<br />
Idee: Verkette mit concat :: [[b]] -> [b]<br />
Oder verwende direkt concatMap :: (a -> [b]) -><br />
[a] -> [b]<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Warum?<br />
Verwandte Funktionen<br />
Wir brauchen: (=«) :: (a -> [b]) -> [a] -> [b]<br />
Wir haben: (a -> [b]) -> [a] -> [[b]]<br />
Idee: Verkette mit concat :: [[b]] -> [b]<br />
Oder verwende direkt concatMap :: (a -> [b]) -><br />
[a] -> [b]<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Warum?<br />
Verwandte Funktionen<br />
Wir brauchen: (=«) :: (a -> [b]) -> [a] -> [b]<br />
Wir haben: (a -> [b]) -> [a] -> [[b]]<br />
Idee: Verkette mit concat :: [[b]] -> [b]<br />
Oder verwende direkt concatMap :: (a -> [b]) -><br />
[a] -> [b]<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Monaden sind Funktoren mit Zusatz<br />
Gliederung<br />
1 Monaden<br />
Warum?<br />
Monaden sind Funktoren mit Zusatz<br />
2 Kategorien<br />
Motivation <strong>und</strong> Definition<br />
Beispiele<br />
In <strong>Haskell</strong>?<br />
3 Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Natürliche Transformationen<br />
Adjungierte Funktoren<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Monaden sind Funktoren mit Zusatz<br />
Die Typklasse Functor<br />
class Functor f where<br />
fmap :: (a -> b) -> f a -> f b<br />
Dabei soll gelten:<br />
fmap id == id<br />
fmap (f . g) == fmap f . fmap g<br />
Jede Instanz von Monad wird zur Instanz von Functor via<br />
fmap f x = (return.f) =« x<br />
Die Regeln für Functor folgen aus denen für Monad<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Monaden sind Funktoren mit Zusatz<br />
Die Typklasse Functor<br />
class Functor f where<br />
fmap :: (a -> b) -> f a -> f b<br />
Dabei soll gelten:<br />
fmap id == id<br />
fmap (f . g) == fmap f . fmap g<br />
Jede Instanz von Monad wird zur Instanz von Functor via<br />
fmap f x = (return.f) =« x<br />
Die Regeln für Functor folgen aus denen für Monad<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Monaden sind Funktoren mit Zusatz<br />
Die Funktion join<br />
join :: Monad m => m (m a) -> m a<br />
join = (id =«)<br />
Aus Monadengesetzen folgt:<br />
join.return = id<br />
join.(fmap return)=id<br />
join.join=join.(fmap join)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Monaden sind Funktoren mit Zusatz<br />
Die Funktion join<br />
join :: Monad m => m (m a) -> m a<br />
join = (id =«)<br />
Aus Monadengesetzen folgt:<br />
join.return = id<br />
join.(fmap return)=id<br />
join.join=join.(fmap join)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Monaden sind Funktoren mit Zusatz<br />
Die Regeln für join am Beispiel []<br />
join.return = id<br />
join(return [0, 1])=join [[0, 1]]=[0, 1]<br />
join.(fmap return)=id<br />
join(fmap return [0, 1])=join [[0],<br />
[1]]=[0, 1]<br />
join.join=join.(fmap join)<br />
join(join[[[0], [1]], [ [2]]]) =join[[0],<br />
[1], [2]] =[0, 1, 2]<br />
join(fmap join[[[0], [1]], [ [2]]])<br />
=join[[0, 1], [2]] =[0, 1, 2]<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Monaden sind Funktoren mit Zusatz<br />
Die Regeln für join am Beispiel []<br />
join.return = id<br />
join(return [0, 1])=join [[0, 1]]=[0, 1]<br />
join.(fmap return)=id<br />
join(fmap return [0, 1])=join [[0],<br />
[1]]=[0, 1]<br />
join.join=join.(fmap join)<br />
join(join[[[0], [1]], [ [2]]]) =join[[0],<br />
[1], [2]] =[0, 1, 2]<br />
join(fmap join[[[0], [1]], [ [2]]])<br />
=join[[0, 1], [2]] =[0, 1, 2]<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Monaden sind Funktoren mit Zusatz<br />
Die Regeln für join am Beispiel []<br />
join.return = id<br />
join(return [0, 1])=join [[0, 1]]=[0, 1]<br />
join.(fmap return)=id<br />
join(fmap return [0, 1])=join [[0],<br />
[1]]=[0, 1]<br />
join.join=join.(fmap join)<br />
join(join[[[0], [1]], [ [2]]]) =join[[0],<br />
[1], [2]] =[0, 1, 2]<br />
join(fmap join[[[0], [1]], [ [2]]])<br />
=join[[0, 1], [2]] =[0, 1, 2]<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Monaden sind Funktoren mit Zusatz<br />
Beispiele für join<br />
[[a]]->[a]<br />
Maybe (Maybe a) -> Maybe a<br />
(r -> r -> a) -> r -> a<br />
Monoid w => ((a, w), w) -> (a, w)<br />
(s -> (s -> (a, s), s)) -> s -> (a, s)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Monaden sind Funktoren mit Zusatz<br />
Beispiele für join<br />
[[a]]->[a]<br />
Maybe (Maybe a) -> Maybe a<br />
(r -> r -> a) -> r -> a<br />
Monoid w => ((a, w), w) -> (a, w)<br />
(s -> (s -> (a, s), s)) -> s -> (a, s)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Monaden sind Funktoren mit Zusatz<br />
Beispiele für join<br />
[[a]]->[a]<br />
Maybe (Maybe a) -> Maybe a<br />
(r -> r -> a) -> r -> a<br />
Monoid w => ((a, w), w) -> (a, w)<br />
(s -> (s -> (a, s), s)) -> s -> (a, s)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Monaden sind Funktoren mit Zusatz<br />
Beispiele für join<br />
[[a]]->[a]<br />
Maybe (Maybe a) -> Maybe a<br />
(r -> r -> a) -> r -> a<br />
Monoid w => ((a, w), w) -> (a, w)<br />
(s -> (s -> (a, s), s)) -> s -> (a, s)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Monaden sind Funktoren mit Zusatz<br />
Beispiele für join<br />
[[a]]->[a]<br />
Maybe (Maybe a) -> Maybe a<br />
(r -> r -> a) -> r -> a<br />
Monoid w => ((a, w), w) -> (a, w)<br />
(s -> (s -> (a, s), s)) -> s -> (a, s)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Monaden sind Funktoren mit Zusatz<br />
So geht es nicht<br />
[a]->a<br />
Maybe a -> a<br />
(r -> a) -> a<br />
Monoid w => (a, w) -> a<br />
(s -> (a, s)) -> a<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Monaden sind Funktoren mit Zusatz<br />
=« rekonstruieren<br />
Durch =« <strong>und</strong> return lässt sich fmap definieren<br />
Durch =« lässt sich join definieren<br />
Aus fmap <strong>und</strong> join erhält man =« zurück:<br />
f =« x = join (fmap f x)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Monaden sind Funktoren mit Zusatz<br />
=« rekonstruieren<br />
Durch =« <strong>und</strong> return lässt sich fmap definieren<br />
Durch =« lässt sich join definieren<br />
Aus fmap <strong>und</strong> join erhält man =« zurück:<br />
f =« x = join (fmap f x)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Monaden sind Funktoren mit Zusatz<br />
=« rekonstruieren<br />
Durch =« <strong>und</strong> return lässt sich fmap definieren<br />
Durch =« lässt sich join definieren<br />
Aus fmap <strong>und</strong> join erhält man =« zurück:<br />
f =« x = join (fmap f x)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Monaden sind Funktoren mit Zusatz<br />
Die andere Sichtweise<br />
Für den Mathematiker sind fmap, return <strong>und</strong> join<br />
elementar<br />
=« ist daraus zusammengesetzt<br />
Beide Möglichkeiten sind äquivalent<br />
Die Regeln gehen ineinander über<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Monaden sind Funktoren mit Zusatz<br />
Die andere Sichtweise<br />
Für den Mathematiker sind fmap, return <strong>und</strong> join<br />
elementar<br />
=« ist daraus zusammengesetzt<br />
Beide Möglichkeiten sind äquivalent<br />
Die Regeln gehen ineinander über<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Monaden sind Funktoren mit Zusatz<br />
Die andere Sichtweise<br />
Für den Mathematiker sind fmap, return <strong>und</strong> join<br />
elementar<br />
=« ist daraus zusammengesetzt<br />
Beide Möglichkeiten sind äquivalent<br />
Die Regeln gehen ineinander über<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Monaden sind Funktoren mit Zusatz<br />
Die andere Sichtweise<br />
Für den Mathematiker sind fmap, return <strong>und</strong> join<br />
elementar<br />
=« ist daraus zusammengesetzt<br />
Beide Möglichkeiten sind äquivalent<br />
Die Regeln gehen ineinander über<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Motivation <strong>und</strong> Definition<br />
Gliederung<br />
1 Monaden<br />
Warum?<br />
Monaden sind Funktoren mit Zusatz<br />
2 Kategorien<br />
Motivation <strong>und</strong> Definition<br />
Beispiele<br />
In <strong>Haskell</strong>?<br />
3 Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Natürliche Transformationen<br />
Adjungierte Funktoren<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Motivation <strong>und</strong> Definition<br />
Ein wiederkehrendes Thema in der Mathematik...<br />
Gilt a ≤ b <strong>und</strong> b ≤ c, dann auch a ≤ c<br />
Gilt k|m <strong>und</strong> m|n, dann auch k|n<br />
⊂,≡,...<br />
Sind f : U → V <strong>und</strong> g : V → W lineare Abbildungen, dann<br />
auch g ◦ f : U → W<br />
injektive, surjektive, stetige, differenzierbare, usw<br />
Abbildungen<br />
Gruppen-, Ring-, Modul-, Algebrenhomomorphismen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Motivation <strong>und</strong> Definition<br />
Ein wiederkehrendes Thema in der Mathematik...<br />
Gilt a ≤ b <strong>und</strong> b ≤ c, dann auch a ≤ c<br />
Gilt k|m <strong>und</strong> m|n, dann auch k|n<br />
⊂,≡,...<br />
Sind f : U → V <strong>und</strong> g : V → W lineare Abbildungen, dann<br />
auch g ◦ f : U → W<br />
injektive, surjektive, stetige, differenzierbare, usw<br />
Abbildungen<br />
Gruppen-, Ring-, Modul-, Algebrenhomomorphismen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Motivation <strong>und</strong> Definition<br />
Ein wiederkehrendes Thema in der Mathematik...<br />
Gilt a ≤ b <strong>und</strong> b ≤ c, dann auch a ≤ c<br />
Gilt k|m <strong>und</strong> m|n, dann auch k|n<br />
⊂,≡,...<br />
Sind f : U → V <strong>und</strong> g : V → W lineare Abbildungen, dann<br />
auch g ◦ f : U → W<br />
injektive, surjektive, stetige, differenzierbare, usw<br />
Abbildungen<br />
Gruppen-, Ring-, Modul-, Algebrenhomomorphismen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Motivation <strong>und</strong> Definition<br />
Ein wiederkehrendes Thema in der Mathematik...<br />
Gilt a ≤ b <strong>und</strong> b ≤ c, dann auch a ≤ c<br />
Gilt k|m <strong>und</strong> m|n, dann auch k|n<br />
⊂,≡,...<br />
Sind f : U → V <strong>und</strong> g : V → W lineare Abbildungen, dann<br />
auch g ◦ f : U → W<br />
injektive, surjektive, stetige, differenzierbare, usw<br />
Abbildungen<br />
Gruppen-, Ring-, Modul-, Algebrenhomomorphismen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Motivation <strong>und</strong> Definition<br />
Ein wiederkehrendes Thema in der Mathematik...<br />
Gilt a ≤ b <strong>und</strong> b ≤ c, dann auch a ≤ c<br />
Gilt k|m <strong>und</strong> m|n, dann auch k|n<br />
⊂,≡,...<br />
Sind f : U → V <strong>und</strong> g : V → W lineare Abbildungen, dann<br />
auch g ◦ f : U → W<br />
injektive, surjektive, stetige, differenzierbare, usw<br />
Abbildungen<br />
Gruppen-, Ring-, Modul-, Algebrenhomomorphismen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Motivation <strong>und</strong> Definition<br />
Ein wiederkehrendes Thema in der Mathematik...<br />
Gilt a ≤ b <strong>und</strong> b ≤ c, dann auch a ≤ c<br />
Gilt k|m <strong>und</strong> m|n, dann auch k|n<br />
⊂,≡,...<br />
Sind f : U → V <strong>und</strong> g : V → W lineare Abbildungen, dann<br />
auch g ◦ f : U → W<br />
injektive, surjektive, stetige, differenzierbare, usw<br />
Abbildungen<br />
Gruppen-, Ring-, Modul-, Algebrenhomomorphismen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Motivation <strong>und</strong> Definition<br />
...verlangt nach einer gemeinsamen Abstraktion<br />
Wir haben:<br />
Objekte (Zahlen, Mengen, Vektorräume, algebraische<br />
Strukturen, ...)<br />
Beziehungen zwischen Objekten (Relationen,<br />
Abbildungen, ...)<br />
die Möglichkeit, Beziehungen zusammenzufassen<br />
(Transitivität der Relationen, Verkettung von Abbildungen)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Motivation <strong>und</strong> Definition<br />
...verlangt nach einer gemeinsamen Abstraktion<br />
Wir haben:<br />
Objekte (Zahlen, Mengen, Vektorräume, algebraische<br />
Strukturen, ...)<br />
Beziehungen zwischen Objekten (Relationen,<br />
Abbildungen, ...)<br />
die Möglichkeit, Beziehungen zusammenzufassen<br />
(Transitivität der Relationen, Verkettung von Abbildungen)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Motivation <strong>und</strong> Definition<br />
...verlangt nach einer gemeinsamen Abstraktion<br />
Wir haben:<br />
Objekte (Zahlen, Mengen, Vektorräume, algebraische<br />
Strukturen, ...)<br />
Beziehungen zwischen Objekten (Relationen,<br />
Abbildungen, ...)<br />
die Möglichkeit, Beziehungen zusammenzufassen<br />
(Transitivität der Relationen, Verkettung von Abbildungen)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Motivation <strong>und</strong> Definition<br />
Slang<br />
Wir sagen:<br />
Objekte<br />
Morphismen oder Pfeile<br />
Verkettung von Morphismen<br />
Alles zusammen heißt Kategorie.<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Motivation <strong>und</strong> Definition<br />
Bedingungen<br />
Wir fordern:<br />
Zu jedem Objekt A gibt es einen Morphismus id A : A → A<br />
mit<br />
A id A<br />
−→ A −→ f B verkettet zu A −→ f B<br />
A<br />
f −→ B id B<br />
−→ B verkettet zu A f −→ B.<br />
Wir nennen ihn Identität von A.<br />
Verkettung ist assoziativ, das heißt für<br />
A<br />
f −→ B<br />
g<br />
−→ C<br />
sind (h◦ g)◦f <strong>und</strong> h◦(g ◦ f) gleich.<br />
h −→ D<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Motivation <strong>und</strong> Definition<br />
Bedingungen<br />
Wir fordern:<br />
Zu jedem Objekt A gibt es einen Morphismus id A : A → A<br />
mit<br />
A id A<br />
−→ A −→ f B verkettet zu A −→ f B<br />
A<br />
f −→ B id B<br />
−→ B verkettet zu A f −→ B.<br />
Wir nennen ihn Identität von A.<br />
Verkettung ist assoziativ, das heißt für<br />
A<br />
f −→ B<br />
g<br />
−→ C<br />
sind (h◦ g)◦f <strong>und</strong> h◦(g ◦ f) gleich.<br />
h −→ D<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Gliederung<br />
1 Monaden<br />
Warum?<br />
Monaden sind Funktoren mit Zusatz<br />
2 Kategorien<br />
Motivation <strong>und</strong> Definition<br />
Beispiele<br />
In <strong>Haskell</strong>?<br />
3 Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Natürliche Transformationen<br />
Adjungierte Funktoren<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Kategorie der Mengen<br />
Objekte sind Mengen<br />
Morphismen sind beliebige Abbildungen<br />
Abbildungen verketten zu Abbildungen<br />
Jede Menge hat ihre Identität ̌<br />
Verkettung ist assoziativ ̌<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Kategorie der Mengen<br />
Objekte sind Mengen<br />
Morphismen sind beliebige Abbildungen<br />
Abbildungen verketten zu Abbildungen<br />
Jede Menge hat ihre Identität ̌<br />
Verkettung ist assoziativ ̌<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Kategorie der Mengen<br />
Objekte sind Mengen<br />
Morphismen sind beliebige Abbildungen<br />
Abbildungen verketten zu Abbildungen<br />
Jede Menge hat ihre Identität ̌<br />
Verkettung ist assoziativ ̌<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Kategorie der Mengen<br />
Objekte sind Mengen<br />
Morphismen sind beliebige Abbildungen<br />
Abbildungen verketten zu Abbildungen<br />
Jede Menge hat ihre Identität ̌<br />
Verkettung ist assoziativ ̌<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Kategorie der Mengen<br />
Objekte sind Mengen<br />
Morphismen sind beliebige Abbildungen<br />
Abbildungen verketten zu Abbildungen<br />
Jede Menge hat ihre Identität ̌<br />
Verkettung ist assoziativ ̌<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Kategorie der punktierten Mengen<br />
Objekte sind Mengen mit einem ausgezeichneten Element<br />
(Basispunkt)<br />
Morphismen sind Abbildungen, die Basispunkte auf<br />
Basispunkte abbilden<br />
Abbildungen verketten zu Abbildungen<br />
Jede Menge hat ihre Identität <strong>und</strong> diese erhält den<br />
Basispunkt ̌<br />
Verkettung ist assoziativ ̌<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Kategorie der punktierten Mengen<br />
Objekte sind Mengen mit einem ausgezeichneten Element<br />
(Basispunkt)<br />
Morphismen sind Abbildungen, die Basispunkte auf<br />
Basispunkte abbilden<br />
Abbildungen verketten zu Abbildungen<br />
Jede Menge hat ihre Identität <strong>und</strong> diese erhält den<br />
Basispunkt ̌<br />
Verkettung ist assoziativ ̌<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Kategorie der punktierten Mengen<br />
Objekte sind Mengen mit einem ausgezeichneten Element<br />
(Basispunkt)<br />
Morphismen sind Abbildungen, die Basispunkte auf<br />
Basispunkte abbilden<br />
Abbildungen verketten zu Abbildungen<br />
Jede Menge hat ihre Identität <strong>und</strong> diese erhält den<br />
Basispunkt ̌<br />
Verkettung ist assoziativ ̌<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Kategorie der punktierten Mengen<br />
Objekte sind Mengen mit einem ausgezeichneten Element<br />
(Basispunkt)<br />
Morphismen sind Abbildungen, die Basispunkte auf<br />
Basispunkte abbilden<br />
Abbildungen verketten zu Abbildungen<br />
Jede Menge hat ihre Identität <strong>und</strong> diese erhält den<br />
Basispunkt ̌<br />
Verkettung ist assoziativ ̌<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Kategorie der punktierten Mengen<br />
Objekte sind Mengen mit einem ausgezeichneten Element<br />
(Basispunkt)<br />
Morphismen sind Abbildungen, die Basispunkte auf<br />
Basispunkte abbilden<br />
Abbildungen verketten zu Abbildungen<br />
Jede Menge hat ihre Identität <strong>und</strong> diese erhält den<br />
Basispunkt ̌<br />
Verkettung ist assoziativ ̌<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Kategorie der Monoide<br />
Objekte sind Monoide<br />
Morphismen sind Monoidhomomorphismen<br />
(f(a·b) = f(a)·f(b) <strong>und</strong> f(e) = e ′ )<br />
Abbildungen verketten zu Abbildungen<br />
Jedes Monoid hat seine Identität <strong>und</strong> diese ist ein<br />
Homomorphismuš<br />
Verkettung ist assoziativ ̌<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Kategorie der Monoide<br />
Objekte sind Monoide<br />
Morphismen sind Monoidhomomorphismen<br />
(f(a·b) = f(a)·f(b) <strong>und</strong> f(e) = e ′ )<br />
Abbildungen verketten zu Abbildungen<br />
Jedes Monoid hat seine Identität <strong>und</strong> diese ist ein<br />
Homomorphismuš<br />
Verkettung ist assoziativ ̌<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Kategorie der Monoide<br />
Objekte sind Monoide<br />
Morphismen sind Monoidhomomorphismen<br />
(f(a·b) = f(a)·f(b) <strong>und</strong> f(e) = e ′ )<br />
Abbildungen verketten zu Abbildungen<br />
Jedes Monoid hat seine Identität <strong>und</strong> diese ist ein<br />
Homomorphismuš<br />
Verkettung ist assoziativ ̌<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Kategorie der Monoide<br />
Objekte sind Monoide<br />
Morphismen sind Monoidhomomorphismen<br />
(f(a·b) = f(a)·f(b) <strong>und</strong> f(e) = e ′ )<br />
Abbildungen verketten zu Abbildungen<br />
Jedes Monoid hat seine Identität <strong>und</strong> diese ist ein<br />
Homomorphismuš<br />
Verkettung ist assoziativ ̌<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Kategorie der Monoide<br />
Objekte sind Monoide<br />
Morphismen sind Monoidhomomorphismen<br />
(f(a·b) = f(a)·f(b) <strong>und</strong> f(e) = e ′ )<br />
Abbildungen verketten zu Abbildungen<br />
Jedes Monoid hat seine Identität <strong>und</strong> diese ist ein<br />
Homomorphismuš<br />
Verkettung ist assoziativ ̌<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Partiell geordnete Mengen als Kategorie<br />
Objekte sind Elemente<br />
Morphismen sind die Beziehungen a ≤ b<br />
(b ≤ c)◦(a ≤ b) = a ≤ c (Transitivität)<br />
Für jedes Element gilt a ≤ a (Reflexivität) ̌<br />
Verkettung ist assoziativ, da zwischen zwei Objekten<br />
höchstens ein Morphismus existiert ̌<br />
Merke: Nicht alle Morphismen sind Abbildungen!<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Partiell geordnete Mengen als Kategorie<br />
Objekte sind Elemente<br />
Morphismen sind die Beziehungen a ≤ b<br />
(b ≤ c)◦(a ≤ b) = a ≤ c (Transitivität)<br />
Für jedes Element gilt a ≤ a (Reflexivität) ̌<br />
Verkettung ist assoziativ, da zwischen zwei Objekten<br />
höchstens ein Morphismus existiert ̌<br />
Merke: Nicht alle Morphismen sind Abbildungen!<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Partiell geordnete Mengen als Kategorie<br />
Objekte sind Elemente<br />
Morphismen sind die Beziehungen a ≤ b<br />
(b ≤ c)◦(a ≤ b) = a ≤ c (Transitivität)<br />
Für jedes Element gilt a ≤ a (Reflexivität) ̌<br />
Verkettung ist assoziativ, da zwischen zwei Objekten<br />
höchstens ein Morphismus existiert ̌<br />
Merke: Nicht alle Morphismen sind Abbildungen!<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Partiell geordnete Mengen als Kategorie<br />
Objekte sind Elemente<br />
Morphismen sind die Beziehungen a ≤ b<br />
(b ≤ c)◦(a ≤ b) = a ≤ c (Transitivität)<br />
Für jedes Element gilt a ≤ a (Reflexivität) ̌<br />
Verkettung ist assoziativ, da zwischen zwei Objekten<br />
höchstens ein Morphismus existiert ̌<br />
Merke: Nicht alle Morphismen sind Abbildungen!<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Partiell geordnete Mengen als Kategorie<br />
Objekte sind Elemente<br />
Morphismen sind die Beziehungen a ≤ b<br />
(b ≤ c)◦(a ≤ b) = a ≤ c (Transitivität)<br />
Für jedes Element gilt a ≤ a (Reflexivität) ̌<br />
Verkettung ist assoziativ, da zwischen zwei Objekten<br />
höchstens ein Morphismus existiert ̌<br />
Merke: Nicht alle Morphismen sind Abbildungen!<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Partiell geordnete Mengen als Kategorie<br />
Objekte sind Elemente<br />
Morphismen sind die Beziehungen a ≤ b<br />
(b ≤ c)◦(a ≤ b) = a ≤ c (Transitivität)<br />
Für jedes Element gilt a ≤ a (Reflexivität) ̌<br />
Verkettung ist assoziativ, da zwischen zwei Objekten<br />
höchstens ein Morphismus existiert ̌<br />
Merke: Nicht alle Morphismen sind Abbildungen!<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Kein Beispiel: Graphen<br />
Objekte sind Knoten<br />
Morphismen sind Kanten<br />
Game over<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Kein Beispiel: Graphen<br />
Objekte sind Knoten<br />
Morphismen sind Kanten<br />
Game over<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Beispiele<br />
Kein Beispiel: Graphen<br />
Objekte sind Knoten<br />
Morphismen sind Kanten<br />
Game over<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
In <strong>Haskell</strong>?<br />
Gliederung<br />
1 Monaden<br />
Warum?<br />
Monaden sind Funktoren mit Zusatz<br />
2 Kategorien<br />
Motivation <strong>und</strong> Definition<br />
Beispiele<br />
In <strong>Haskell</strong>?<br />
3 Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Natürliche Transformationen<br />
Adjungierte Funktoren<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
In <strong>Haskell</strong>?<br />
Kategorien sind Mengen von Datentypen<br />
Die Kategorie der Mengen entspricht allen Datentypen<br />
Die Kategorie der Monoide entspricht der Typklasse<br />
monoid<br />
Punktierte Mengen?<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
In <strong>Haskell</strong>?<br />
Kategorien sind Mengen von Datentypen<br />
Die Kategorie der Mengen entspricht allen Datentypen<br />
Die Kategorie der Monoide entspricht der Typklasse<br />
monoid<br />
Punktierte Mengen?<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
In <strong>Haskell</strong>?<br />
Kategorien sind Mengen von Datentypen<br />
Die Kategorie der Mengen entspricht allen Datentypen<br />
Die Kategorie der Monoide entspricht der Typklasse<br />
monoid<br />
Punktierte Mengen?<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
In <strong>Haskell</strong>?<br />
Punktierte Mengen als Typklasse<br />
class Pointed a where<br />
point :: a<br />
instance Pointed Integer where point = 0<br />
instance Pointed Bool where point = False<br />
instance Pointed [a] where point = []<br />
instance Pointed Maybe a where point =<br />
nothing<br />
Achtung: Die punktierten Abbildungen lassen sich nicht so<br />
charakterisieren.<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
In <strong>Haskell</strong>?<br />
Punktierte Mengen als Typklasse<br />
class Pointed a where<br />
point :: a<br />
instance Pointed Integer where point = 0<br />
instance Pointed Bool where point = False<br />
instance Pointed [a] where point = []<br />
instance Pointed Maybe a where point =<br />
nothing<br />
Achtung: Die punktierten Abbildungen lassen sich nicht so<br />
charakterisieren.<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
In <strong>Haskell</strong>?<br />
Punktierte Mengen als Typklasse<br />
class Pointed a where<br />
point :: a<br />
instance Pointed Integer where point = 0<br />
instance Pointed Bool where point = False<br />
instance Pointed [a] where point = []<br />
instance Pointed Maybe a where point =<br />
nothing<br />
Achtung: Die punktierten Abbildungen lassen sich nicht so<br />
charakterisieren.<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
In <strong>Haskell</strong>?<br />
Wörterbuch<br />
<strong>Kategorientheorie</strong><br />
Objekt<br />
Morphismus<br />
Kategorie<br />
<strong>Haskell</strong><br />
Datentyp<br />
Funktion<br />
Typklasse, Menge von Typen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Gliederung<br />
1 Monaden<br />
Warum?<br />
Monaden sind Funktoren mit Zusatz<br />
2 Kategorien<br />
Motivation <strong>und</strong> Definition<br />
Beispiele<br />
In <strong>Haskell</strong>?<br />
3 Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Natürliche Transformationen<br />
Adjungierte Funktoren<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Definition<br />
Ein Funktor F führt von einer Kategorie in eine andere.<br />
Jedem Objekt X wird ein Objekt F(X) zugeordnet<br />
Jedem Morphismus X → Y wird ein Morphismus<br />
F(X) → F(Y) zugeordnet<br />
Dabei sollen folgende Regeln gelten:<br />
F(id) = id (genauer F(id X ) = id F(X) )<br />
F(g ◦ f) = F(g)◦F(f)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Definition<br />
Ein Funktor F führt von einer Kategorie in eine andere.<br />
Jedem Objekt X wird ein Objekt F(X) zugeordnet<br />
Jedem Morphismus X → Y wird ein Morphismus<br />
F(X) → F(Y) zugeordnet<br />
Dabei sollen folgende Regeln gelten:<br />
F(id) = id (genauer F(id X ) = id F(X) )<br />
F(g ◦ f) = F(g)◦F(f)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Definition<br />
Ein Funktor F führt von einer Kategorie in eine andere.<br />
Jedem Objekt X wird ein Objekt F(X) zugeordnet<br />
Jedem Morphismus X → Y wird ein Morphismus<br />
F(X) → F(Y) zugeordnet<br />
Dabei sollen folgende Regeln gelten:<br />
F(id) = id (genauer F(id X ) = id F(X) )<br />
F(g ◦ f) = F(g)◦F(f)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Definition<br />
Ein Funktor F führt von einer Kategorie in eine andere.<br />
Jedem Objekt X wird ein Objekt F(X) zugeordnet<br />
Jedem Morphismus X → Y wird ein Morphismus<br />
F(X) → F(Y) zugeordnet<br />
Dabei sollen folgende Regeln gelten:<br />
F(id) = id (genauer F(id X ) = id F(X) )<br />
F(g ◦ f) = F(g)◦F(f)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Definition<br />
Ein Funktor F führt von einer Kategorie in eine andere.<br />
Jedem Objekt X wird ein Objekt F(X) zugeordnet<br />
Jedem Morphismus X → Y wird ein Morphismus<br />
F(X) → F(Y) zugeordnet<br />
Dabei sollen folgende Regeln gelten:<br />
F(id) = id (genauer F(id X ) = id F(X) )<br />
F(g ◦ f) = F(g)◦F(f)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Beispiel: Freie Monoide<br />
Der Funktor frei erzeugtes Monoid führt von der Kategorie der<br />
Mengen in die Kategorie der Monoide.<br />
Jeder Menge wird das von dieser Menge frei erzeugte<br />
Monoid zugeordnet<br />
Oder: Jedem Datentyp a wird der Datentyp [a]<br />
zugeordnet<br />
Das Ergebnis ist tatsächlich ein Monoid<br />
Jeder Abbildung wird die entsprechende Abbildung<br />
zwischen Monoiden zugeordnet (Buchstabenersetzung)<br />
Diese Abbildungen sind mit den Verknüpfungen der<br />
Monoide verträglich<br />
Die Regeln für Funktoren sind erfüllt<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Beispiel: Freie Monoide<br />
Der Funktor frei erzeugtes Monoid führt von der Kategorie der<br />
Mengen in die Kategorie der Monoide.<br />
Jeder Menge wird das von dieser Menge frei erzeugte<br />
Monoid zugeordnet<br />
Oder: Jedem Datentyp a wird der Datentyp [a]<br />
zugeordnet<br />
Das Ergebnis ist tatsächlich ein Monoid<br />
Jeder Abbildung wird die entsprechende Abbildung<br />
zwischen Monoiden zugeordnet (Buchstabenersetzung)<br />
Diese Abbildungen sind mit den Verknüpfungen der<br />
Monoide verträglich<br />
Die Regeln für Funktoren sind erfüllt<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Beispiel: Freie Monoide<br />
Der Funktor frei erzeugtes Monoid führt von der Kategorie der<br />
Mengen in die Kategorie der Monoide.<br />
Jeder Menge wird das von dieser Menge frei erzeugte<br />
Monoid zugeordnet<br />
Oder: Jedem Datentyp a wird der Datentyp [a]<br />
zugeordnet<br />
Das Ergebnis ist tatsächlich ein Monoid<br />
Jeder Abbildung wird die entsprechende Abbildung<br />
zwischen Monoiden zugeordnet (Buchstabenersetzung)<br />
Diese Abbildungen sind mit den Verknüpfungen der<br />
Monoide verträglich<br />
Die Regeln für Funktoren sind erfüllt<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Beispiel: Freie Monoide<br />
Der Funktor frei erzeugtes Monoid führt von der Kategorie der<br />
Mengen in die Kategorie der Monoide.<br />
Jeder Menge wird das von dieser Menge frei erzeugte<br />
Monoid zugeordnet<br />
Oder: Jedem Datentyp a wird der Datentyp [a]<br />
zugeordnet<br />
Das Ergebnis ist tatsächlich ein Monoid<br />
Jeder Abbildung wird die entsprechende Abbildung<br />
zwischen Monoiden zugeordnet (Buchstabenersetzung)<br />
Diese Abbildungen sind mit den Verknüpfungen der<br />
Monoide verträglich<br />
Die Regeln für Funktoren sind erfüllt<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Beispiel: Freie Monoide<br />
Der Funktor frei erzeugtes Monoid führt von der Kategorie der<br />
Mengen in die Kategorie der Monoide.<br />
Jeder Menge wird das von dieser Menge frei erzeugte<br />
Monoid zugeordnet<br />
Oder: Jedem Datentyp a wird der Datentyp [a]<br />
zugeordnet<br />
Das Ergebnis ist tatsächlich ein Monoid<br />
Jeder Abbildung wird die entsprechende Abbildung<br />
zwischen Monoiden zugeordnet (Buchstabenersetzung)<br />
Diese Abbildungen sind mit den Verknüpfungen der<br />
Monoide verträglich<br />
Die Regeln für Funktoren sind erfüllt<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Beispiel: Freie Monoide<br />
Der Funktor frei erzeugtes Monoid führt von der Kategorie der<br />
Mengen in die Kategorie der Monoide.<br />
Jeder Menge wird das von dieser Menge frei erzeugte<br />
Monoid zugeordnet<br />
Oder: Jedem Datentyp a wird der Datentyp [a]<br />
zugeordnet<br />
Das Ergebnis ist tatsächlich ein Monoid<br />
Jeder Abbildung wird die entsprechende Abbildung<br />
zwischen Monoiden zugeordnet (Buchstabenersetzung)<br />
Diese Abbildungen sind mit den Verknüpfungen der<br />
Monoide verträglich<br />
Die Regeln für Funktoren sind erfüllt<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Beispiel: Basispunkt hinzufügen<br />
Der Funktor externen Basispunkt hinzufügen führt von der<br />
Kategorie der Mengen in die Kategorie der punktierten<br />
Mengen.<br />
Jede Menge wird um einen zusätzlichen Punkt erweitert<br />
Oder: Jedem Datentyp a wird der Datentyp Maybe a<br />
zugeordnet<br />
Das Ergebnis ist tatsächlich punktiert<br />
Jeder Abbildung wird um die Regel Basispunkt auf<br />
Basispunkt erweitert<br />
Diese Abbildungen ist tatsächlich Abbildung punktierter<br />
Mengen<br />
Die Regeln für Funktoren sind erfüllt<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Beispiel: Basispunkt hinzufügen<br />
Der Funktor externen Basispunkt hinzufügen führt von der<br />
Kategorie der Mengen in die Kategorie der punktierten<br />
Mengen.<br />
Jede Menge wird um einen zusätzlichen Punkt erweitert<br />
Oder: Jedem Datentyp a wird der Datentyp Maybe a<br />
zugeordnet<br />
Das Ergebnis ist tatsächlich punktiert<br />
Jeder Abbildung wird um die Regel Basispunkt auf<br />
Basispunkt erweitert<br />
Diese Abbildungen ist tatsächlich Abbildung punktierter<br />
Mengen<br />
Die Regeln für Funktoren sind erfüllt<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Beispiel: Basispunkt hinzufügen<br />
Der Funktor externen Basispunkt hinzufügen führt von der<br />
Kategorie der Mengen in die Kategorie der punktierten<br />
Mengen.<br />
Jede Menge wird um einen zusätzlichen Punkt erweitert<br />
Oder: Jedem Datentyp a wird der Datentyp Maybe a<br />
zugeordnet<br />
Das Ergebnis ist tatsächlich punktiert<br />
Jeder Abbildung wird um die Regel Basispunkt auf<br />
Basispunkt erweitert<br />
Diese Abbildungen ist tatsächlich Abbildung punktierter<br />
Mengen<br />
Die Regeln für Funktoren sind erfüllt<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Beispiel: Basispunkt hinzufügen<br />
Der Funktor externen Basispunkt hinzufügen führt von der<br />
Kategorie der Mengen in die Kategorie der punktierten<br />
Mengen.<br />
Jede Menge wird um einen zusätzlichen Punkt erweitert<br />
Oder: Jedem Datentyp a wird der Datentyp Maybe a<br />
zugeordnet<br />
Das Ergebnis ist tatsächlich punktiert<br />
Jeder Abbildung wird um die Regel Basispunkt auf<br />
Basispunkt erweitert<br />
Diese Abbildungen ist tatsächlich Abbildung punktierter<br />
Mengen<br />
Die Regeln für Funktoren sind erfüllt<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Beispiel: Basispunkt hinzufügen<br />
Der Funktor externen Basispunkt hinzufügen führt von der<br />
Kategorie der Mengen in die Kategorie der punktierten<br />
Mengen.<br />
Jede Menge wird um einen zusätzlichen Punkt erweitert<br />
Oder: Jedem Datentyp a wird der Datentyp Maybe a<br />
zugeordnet<br />
Das Ergebnis ist tatsächlich punktiert<br />
Jeder Abbildung wird um die Regel Basispunkt auf<br />
Basispunkt erweitert<br />
Diese Abbildungen ist tatsächlich Abbildung punktierter<br />
Mengen<br />
Die Regeln für Funktoren sind erfüllt<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Beispiel: Basispunkt hinzufügen<br />
Der Funktor externen Basispunkt hinzufügen führt von der<br />
Kategorie der Mengen in die Kategorie der punktierten<br />
Mengen.<br />
Jede Menge wird um einen zusätzlichen Punkt erweitert<br />
Oder: Jedem Datentyp a wird der Datentyp Maybe a<br />
zugeordnet<br />
Das Ergebnis ist tatsächlich punktiert<br />
Jeder Abbildung wird um die Regel Basispunkt auf<br />
Basispunkt erweitert<br />
Diese Abbildungen ist tatsächlich Abbildung punktierter<br />
Mengen<br />
Die Regeln für Funktoren sind erfüllt<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Beispiel: Vergissfunktoren<br />
Der Vergissfunktor führt von der Kategorie der Monoide in die<br />
Kategorie der Mengen.<br />
Jedem Monoid wird die zugr<strong>und</strong>e liegende Menge<br />
zugeordnet<br />
Jeder Abbildung wird die zugr<strong>und</strong>e liegende<br />
Mengenabbildung zugeordnet<br />
Die Regeln für Funktoren sind erfüllt<br />
Das funktioniert genauso für punktierte Mengen: Wir<br />
vergessen, welcher Punkt markiert ist. Achtung: Vergessen<br />
macht nicht freies Monoid rückgängig!<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Beispiel: Vergissfunktoren<br />
Der Vergissfunktor führt von der Kategorie der Monoide in die<br />
Kategorie der Mengen.<br />
Jedem Monoid wird die zugr<strong>und</strong>e liegende Menge<br />
zugeordnet<br />
Jeder Abbildung wird die zugr<strong>und</strong>e liegende<br />
Mengenabbildung zugeordnet<br />
Die Regeln für Funktoren sind erfüllt<br />
Das funktioniert genauso für punktierte Mengen: Wir<br />
vergessen, welcher Punkt markiert ist. Achtung: Vergessen<br />
macht nicht freies Monoid rückgängig!<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Beispiel: Vergissfunktoren<br />
Der Vergissfunktor führt von der Kategorie der Monoide in die<br />
Kategorie der Mengen.<br />
Jedem Monoid wird die zugr<strong>und</strong>e liegende Menge<br />
zugeordnet<br />
Jeder Abbildung wird die zugr<strong>und</strong>e liegende<br />
Mengenabbildung zugeordnet<br />
Die Regeln für Funktoren sind erfüllt<br />
Das funktioniert genauso für punktierte Mengen: Wir<br />
vergessen, welcher Punkt markiert ist. Achtung: Vergessen<br />
macht nicht freies Monoid rückgängig!<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Beispiel: Vergissfunktoren<br />
Der Vergissfunktor führt von der Kategorie der Monoide in die<br />
Kategorie der Mengen.<br />
Jedem Monoid wird die zugr<strong>und</strong>e liegende Menge<br />
zugeordnet<br />
Jeder Abbildung wird die zugr<strong>und</strong>e liegende<br />
Mengenabbildung zugeordnet<br />
Die Regeln für Funktoren sind erfüllt<br />
Das funktioniert genauso für punktierte Mengen: Wir<br />
vergessen, welcher Punkt markiert ist. Achtung: Vergessen<br />
macht nicht freies Monoid rückgängig!<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Beispiel: Vergissfunktoren<br />
Der Vergissfunktor führt von der Kategorie der Monoide in die<br />
Kategorie der Mengen.<br />
Jedem Monoid wird die zugr<strong>und</strong>e liegende Menge<br />
zugeordnet<br />
Jeder Abbildung wird die zugr<strong>und</strong>e liegende<br />
Mengenabbildung zugeordnet<br />
Die Regeln für Funktoren sind erfüllt<br />
Das funktioniert genauso für punktierte Mengen: Wir<br />
vergessen, welcher Punkt markiert ist. Achtung: Vergessen<br />
macht nicht freies Monoid rückgängig!<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Beispiele für Funktoren: Identitätsfunktoren<br />
Nichts zu verändern ist auch für jede Kategorie ein Funktor<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Zurück zur Typklasse Functor<br />
class Functor f where<br />
fmap :: (a -> b) -> f a -> f b<br />
f ordnet jedem Typ einen anderen Typ zu (f:: * -> *)<br />
fmap erklärt das Verhalten für Abbildungen<br />
Die Regeln für Identität <strong>und</strong> Verknüpfung sollen erfüllt sein<br />
Das wird aber tatsächlich nie geprüft<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Zurück zur Typklasse Functor<br />
class Functor f where<br />
fmap :: (a -> b) -> f a -> f b<br />
f ordnet jedem Typ einen anderen Typ zu (f:: * -> *)<br />
fmap erklärt das Verhalten für Abbildungen<br />
Die Regeln für Identität <strong>und</strong> Verknüpfung sollen erfüllt sein<br />
Das wird aber tatsächlich nie geprüft<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Zurück zur Typklasse Functor<br />
class Functor f where<br />
fmap :: (a -> b) -> f a -> f b<br />
f ordnet jedem Typ einen anderen Typ zu (f:: * -> *)<br />
fmap erklärt das Verhalten für Abbildungen<br />
Die Regeln für Identität <strong>und</strong> Verknüpfung sollen erfüllt sein<br />
Das wird aber tatsächlich nie geprüft<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Zurück zur Typklasse Functor<br />
class Functor f where<br />
fmap :: (a -> b) -> f a -> f b<br />
f ordnet jedem Typ einen anderen Typ zu (f:: * -> *)<br />
fmap erklärt das Verhalten für Abbildungen<br />
Die Regeln für Identität <strong>und</strong> Verknüpfung sollen erfüllt sein<br />
Das wird aber tatsächlich nie geprüft<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Zurück zur Typklasse Functor<br />
class Functor f where<br />
fmap :: (a -> b) -> f a -> f b<br />
f ordnet jedem Typ einen anderen Typ zu (f:: * -> *)<br />
fmap erklärt das Verhalten für Abbildungen<br />
Die Regeln für Identität <strong>und</strong> Verknüpfung sollen erfüllt sein<br />
Das wird aber tatsächlich nie geprüft<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Wörterbuch<br />
<strong>Kategorientheorie</strong><br />
Objekt<br />
Morphismus<br />
Kategorie<br />
Funktor<br />
<strong>Haskell</strong><br />
Datentyp<br />
Funktion<br />
Typklasse, Menge von Typen<br />
Instanz von Functor<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Gliederung<br />
1 Monaden<br />
Warum?<br />
Monaden sind Funktoren mit Zusatz<br />
2 Kategorien<br />
Motivation <strong>und</strong> Definition<br />
Beispiele<br />
In <strong>Haskell</strong>?<br />
3 Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Natürliche Transformationen<br />
Adjungierte Funktoren<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Motivierendes Beispiel<br />
Habe zwei Funktoren von Mengen nach punktierte Mengen:<br />
Maybe (Basispunkt ist Nothing)<br />
[] (Basispunkt ist [])<br />
Betrachte folgende Funktion:<br />
maybeToList :: Maybe a -> [a]<br />
maybeToList Nothing = []<br />
maybeToList Just x = [x]<br />
Für f::a -> b gilt:<br />
fmap f (maybeToList x)=maybeToList (fmap f x)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Motivierendes Beispiel<br />
Habe zwei Funktoren von Mengen nach punktierte Mengen:<br />
Maybe (Basispunkt ist Nothing)<br />
[] (Basispunkt ist [])<br />
Betrachte folgende Funktion:<br />
maybeToList :: Maybe a -> [a]<br />
maybeToList Nothing = []<br />
maybeToList Just x = [x]<br />
Für f::a -> b gilt:<br />
fmap f (maybeToList x)=maybeToList (fmap f x)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Motivierendes Beispiel<br />
Habe zwei Funktoren von Mengen nach punktierte Mengen:<br />
Maybe (Basispunkt ist Nothing)<br />
[] (Basispunkt ist [])<br />
Betrachte folgende Funktion:<br />
maybeToList :: Maybe a -> [a]<br />
maybeToList Nothing = []<br />
maybeToList Just x = [x]<br />
Für f::a -> b gilt:<br />
fmap f (maybeToList x)=maybeToList (fmap f x)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Weitere Beispiele<br />
Just vermittelt auf gleiche Weise zwischen dem<br />
identischen Funktor <strong>und</strong> Maybe<br />
\x->[x] vermittelt zwischen identischem Funktor <strong>und</strong> []<br />
...<br />
So etwas nennt man natürliche Transformation<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Weitere Beispiele<br />
Just vermittelt auf gleiche Weise zwischen dem<br />
identischen Funktor <strong>und</strong> Maybe<br />
\x->[x] vermittelt zwischen identischem Funktor <strong>und</strong> []<br />
...<br />
So etwas nennt man natürliche Transformation<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Weitere Beispiele<br />
Just vermittelt auf gleiche Weise zwischen dem<br />
identischen Funktor <strong>und</strong> Maybe<br />
\x->[x] vermittelt zwischen identischem Funktor <strong>und</strong> []<br />
...<br />
So etwas nennt man natürliche Transformation<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Weitere Beispiele<br />
Just vermittelt auf gleiche Weise zwischen dem<br />
identischen Funktor <strong>und</strong> Maybe<br />
\x->[x] vermittelt zwischen identischem Funktor <strong>und</strong> []<br />
...<br />
So etwas nennt man natürliche Transformation<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Definition<br />
C <strong>und</strong> D seien zwei Kategorien<br />
F <strong>und</strong> G seien zwei Funktoren von C nach D<br />
Zu jedem Objekt X aus C gibt es Objekte F(X) <strong>und</strong> G(X)<br />
in D<br />
Eine natürliche Transformation ordnet jedem Objekt X<br />
zusätzlich einen Morphismus F(X) → G(X) zu<br />
Ist Y ein weiteres Objekt in C, dann gibt es ebenso F(Y),<br />
G(Y) <strong>und</strong> einen Morphismus F(Y) → G(Y)<br />
Ist f : X → Y ein Morphismus, erhalten wir<br />
F(f) : F(X) → F(Y) <strong>und</strong> G(f) : G(X) → G(Y)<br />
Nun führen zwei Wege von F(X) nach G(Y), nämlich über<br />
F(Y) oder über G(X)<br />
Beide Wege sollen übereinstimmen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Definition<br />
C <strong>und</strong> D seien zwei Kategorien<br />
F <strong>und</strong> G seien zwei Funktoren von C nach D<br />
Zu jedem Objekt X aus C gibt es Objekte F(X) <strong>und</strong> G(X)<br />
in D<br />
Eine natürliche Transformation ordnet jedem Objekt X<br />
zusätzlich einen Morphismus F(X) → G(X) zu<br />
Ist Y ein weiteres Objekt in C, dann gibt es ebenso F(Y),<br />
G(Y) <strong>und</strong> einen Morphismus F(Y) → G(Y)<br />
Ist f : X → Y ein Morphismus, erhalten wir<br />
F(f) : F(X) → F(Y) <strong>und</strong> G(f) : G(X) → G(Y)<br />
Nun führen zwei Wege von F(X) nach G(Y), nämlich über<br />
F(Y) oder über G(X)<br />
Beide Wege sollen übereinstimmen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Definition<br />
C <strong>und</strong> D seien zwei Kategorien<br />
F <strong>und</strong> G seien zwei Funktoren von C nach D<br />
Zu jedem Objekt X aus C gibt es Objekte F(X) <strong>und</strong> G(X)<br />
in D<br />
Eine natürliche Transformation ordnet jedem Objekt X<br />
zusätzlich einen Morphismus F(X) → G(X) zu<br />
Ist Y ein weiteres Objekt in C, dann gibt es ebenso F(Y),<br />
G(Y) <strong>und</strong> einen Morphismus F(Y) → G(Y)<br />
Ist f : X → Y ein Morphismus, erhalten wir<br />
F(f) : F(X) → F(Y) <strong>und</strong> G(f) : G(X) → G(Y)<br />
Nun führen zwei Wege von F(X) nach G(Y), nämlich über<br />
F(Y) oder über G(X)<br />
Beide Wege sollen übereinstimmen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Definition<br />
C <strong>und</strong> D seien zwei Kategorien<br />
F <strong>und</strong> G seien zwei Funktoren von C nach D<br />
Zu jedem Objekt X aus C gibt es Objekte F(X) <strong>und</strong> G(X)<br />
in D<br />
Eine natürliche Transformation ordnet jedem Objekt X<br />
zusätzlich einen Morphismus F(X) → G(X) zu<br />
Ist Y ein weiteres Objekt in C, dann gibt es ebenso F(Y),<br />
G(Y) <strong>und</strong> einen Morphismus F(Y) → G(Y)<br />
Ist f : X → Y ein Morphismus, erhalten wir<br />
F(f) : F(X) → F(Y) <strong>und</strong> G(f) : G(X) → G(Y)<br />
Nun führen zwei Wege von F(X) nach G(Y), nämlich über<br />
F(Y) oder über G(X)<br />
Beide Wege sollen übereinstimmen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Definition<br />
C <strong>und</strong> D seien zwei Kategorien<br />
F <strong>und</strong> G seien zwei Funktoren von C nach D<br />
Zu jedem Objekt X aus C gibt es Objekte F(X) <strong>und</strong> G(X)<br />
in D<br />
Eine natürliche Transformation ordnet jedem Objekt X<br />
zusätzlich einen Morphismus F(X) → G(X) zu<br />
Ist Y ein weiteres Objekt in C, dann gibt es ebenso F(Y),<br />
G(Y) <strong>und</strong> einen Morphismus F(Y) → G(Y)<br />
Ist f : X → Y ein Morphismus, erhalten wir<br />
F(f) : F(X) → F(Y) <strong>und</strong> G(f) : G(X) → G(Y)<br />
Nun führen zwei Wege von F(X) nach G(Y), nämlich über<br />
F(Y) oder über G(X)<br />
Beide Wege sollen übereinstimmen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Definition<br />
C <strong>und</strong> D seien zwei Kategorien<br />
F <strong>und</strong> G seien zwei Funktoren von C nach D<br />
Zu jedem Objekt X aus C gibt es Objekte F(X) <strong>und</strong> G(X)<br />
in D<br />
Eine natürliche Transformation ordnet jedem Objekt X<br />
zusätzlich einen Morphismus F(X) → G(X) zu<br />
Ist Y ein weiteres Objekt in C, dann gibt es ebenso F(Y),<br />
G(Y) <strong>und</strong> einen Morphismus F(Y) → G(Y)<br />
Ist f : X → Y ein Morphismus, erhalten wir<br />
F(f) : F(X) → F(Y) <strong>und</strong> G(f) : G(X) → G(Y)<br />
Nun führen zwei Wege von F(X) nach G(Y), nämlich über<br />
F(Y) oder über G(X)<br />
Beide Wege sollen übereinstimmen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Definition<br />
C <strong>und</strong> D seien zwei Kategorien<br />
F <strong>und</strong> G seien zwei Funktoren von C nach D<br />
Zu jedem Objekt X aus C gibt es Objekte F(X) <strong>und</strong> G(X)<br />
in D<br />
Eine natürliche Transformation ordnet jedem Objekt X<br />
zusätzlich einen Morphismus F(X) → G(X) zu<br />
Ist Y ein weiteres Objekt in C, dann gibt es ebenso F(Y),<br />
G(Y) <strong>und</strong> einen Morphismus F(Y) → G(Y)<br />
Ist f : X → Y ein Morphismus, erhalten wir<br />
F(f) : F(X) → F(Y) <strong>und</strong> G(f) : G(X) → G(Y)<br />
Nun führen zwei Wege von F(X) nach G(Y), nämlich über<br />
F(Y) oder über G(X)<br />
Beide Wege sollen übereinstimmen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Definition<br />
C <strong>und</strong> D seien zwei Kategorien<br />
F <strong>und</strong> G seien zwei Funktoren von C nach D<br />
Zu jedem Objekt X aus C gibt es Objekte F(X) <strong>und</strong> G(X)<br />
in D<br />
Eine natürliche Transformation ordnet jedem Objekt X<br />
zusätzlich einen Morphismus F(X) → G(X) zu<br />
Ist Y ein weiteres Objekt in C, dann gibt es ebenso F(Y),<br />
G(Y) <strong>und</strong> einen Morphismus F(Y) → G(Y)<br />
Ist f : X → Y ein Morphismus, erhalten wir<br />
F(f) : F(X) → F(Y) <strong>und</strong> G(f) : G(X) → G(Y)<br />
Nun führen zwei Wege von F(X) nach G(Y), nämlich über<br />
F(Y) oder über G(X)<br />
Beide Wege sollen übereinstimmen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Wichtiger Sonderfall<br />
D = C<br />
F = id <strong>und</strong> G seien zwei Funktoren von C nach C<br />
Zu jedem Objekt X aus C gibt es ein Objekt G(X) in C<br />
Eine natürliche Transformation ordnet jedem Objekt X<br />
einen Morphismus X → G(X) zu<br />
Ist Y ein weiteres Objekt in C, dann gibt es ebenso G(Y)<br />
<strong>und</strong> einen Morphismus Y → G(Y)<br />
Ist f : X → Y ein Morphismus, erhalten wir<br />
G(f) : G(X) → G(Y)<br />
Nun führen zwei Wege von X nach G(Y), nämlich über Y<br />
oder über G(X)<br />
Beide Wege sollen übereinstimmen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Wichtiger Sonderfall<br />
D = C<br />
F = id <strong>und</strong> G seien zwei Funktoren von C nach C<br />
Zu jedem Objekt X aus C gibt es ein Objekt G(X) in C<br />
Eine natürliche Transformation ordnet jedem Objekt X<br />
einen Morphismus X → G(X) zu<br />
Ist Y ein weiteres Objekt in C, dann gibt es ebenso G(Y)<br />
<strong>und</strong> einen Morphismus Y → G(Y)<br />
Ist f : X → Y ein Morphismus, erhalten wir<br />
G(f) : G(X) → G(Y)<br />
Nun führen zwei Wege von X nach G(Y), nämlich über Y<br />
oder über G(X)<br />
Beide Wege sollen übereinstimmen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Wichtiger Sonderfall<br />
D = C<br />
F = id <strong>und</strong> G seien zwei Funktoren von C nach C<br />
Zu jedem Objekt X aus C gibt es ein Objekt G(X) in C<br />
Eine natürliche Transformation ordnet jedem Objekt X<br />
einen Morphismus X → G(X) zu<br />
Ist Y ein weiteres Objekt in C, dann gibt es ebenso G(Y)<br />
<strong>und</strong> einen Morphismus Y → G(Y)<br />
Ist f : X → Y ein Morphismus, erhalten wir<br />
G(f) : G(X) → G(Y)<br />
Nun führen zwei Wege von X nach G(Y), nämlich über Y<br />
oder über G(X)<br />
Beide Wege sollen übereinstimmen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Wichtiger Sonderfall<br />
D = C<br />
F = id <strong>und</strong> G seien zwei Funktoren von C nach C<br />
Zu jedem Objekt X aus C gibt es ein Objekt G(X) in C<br />
Eine natürliche Transformation ordnet jedem Objekt X<br />
einen Morphismus X → G(X) zu<br />
Ist Y ein weiteres Objekt in C, dann gibt es ebenso G(Y)<br />
<strong>und</strong> einen Morphismus Y → G(Y)<br />
Ist f : X → Y ein Morphismus, erhalten wir<br />
G(f) : G(X) → G(Y)<br />
Nun führen zwei Wege von X nach G(Y), nämlich über Y<br />
oder über G(X)<br />
Beide Wege sollen übereinstimmen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Wichtiger Sonderfall<br />
D = C<br />
F = id <strong>und</strong> G seien zwei Funktoren von C nach C<br />
Zu jedem Objekt X aus C gibt es ein Objekt G(X) in C<br />
Eine natürliche Transformation ordnet jedem Objekt X<br />
einen Morphismus X → G(X) zu<br />
Ist Y ein weiteres Objekt in C, dann gibt es ebenso G(Y)<br />
<strong>und</strong> einen Morphismus Y → G(Y)<br />
Ist f : X → Y ein Morphismus, erhalten wir<br />
G(f) : G(X) → G(Y)<br />
Nun führen zwei Wege von X nach G(Y), nämlich über Y<br />
oder über G(X)<br />
Beide Wege sollen übereinstimmen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Wichtiger Sonderfall<br />
D = C<br />
F = id <strong>und</strong> G seien zwei Funktoren von C nach C<br />
Zu jedem Objekt X aus C gibt es ein Objekt G(X) in C<br />
Eine natürliche Transformation ordnet jedem Objekt X<br />
einen Morphismus X → G(X) zu<br />
Ist Y ein weiteres Objekt in C, dann gibt es ebenso G(Y)<br />
<strong>und</strong> einen Morphismus Y → G(Y)<br />
Ist f : X → Y ein Morphismus, erhalten wir<br />
G(f) : G(X) → G(Y)<br />
Nun führen zwei Wege von X nach G(Y), nämlich über Y<br />
oder über G(X)<br />
Beide Wege sollen übereinstimmen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Wichtiger Sonderfall<br />
D = C<br />
F = id <strong>und</strong> G seien zwei Funktoren von C nach C<br />
Zu jedem Objekt X aus C gibt es ein Objekt G(X) in C<br />
Eine natürliche Transformation ordnet jedem Objekt X<br />
einen Morphismus X → G(X) zu<br />
Ist Y ein weiteres Objekt in C, dann gibt es ebenso G(Y)<br />
<strong>und</strong> einen Morphismus Y → G(Y)<br />
Ist f : X → Y ein Morphismus, erhalten wir<br />
G(f) : G(X) → G(Y)<br />
Nun führen zwei Wege von X nach G(Y), nämlich über Y<br />
oder über G(X)<br />
Beide Wege sollen übereinstimmen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Wichtiger Sonderfall<br />
D = C<br />
F = id <strong>und</strong> G seien zwei Funktoren von C nach C<br />
Zu jedem Objekt X aus C gibt es ein Objekt G(X) in C<br />
Eine natürliche Transformation ordnet jedem Objekt X<br />
einen Morphismus X → G(X) zu<br />
Ist Y ein weiteres Objekt in C, dann gibt es ebenso G(Y)<br />
<strong>und</strong> einen Morphismus Y → G(Y)<br />
Ist f : X → Y ein Morphismus, erhalten wir<br />
G(f) : G(X) → G(Y)<br />
Nun führen zwei Wege von X nach G(Y), nämlich über Y<br />
oder über G(X)<br />
Beide Wege sollen übereinstimmen<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Natürliche Transformationen aus Monaden<br />
Sei m::* -> * Monade<br />
Dann ist m ein Funktor<br />
return ist eine natürliche Transformation zwischen der<br />
Identität <strong>und</strong> m<br />
join ist eine natürliche Transformation zwischen m.m <strong>und</strong><br />
m<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Natürliche Transformationen aus Monaden<br />
Sei m::* -> * Monade<br />
Dann ist m ein Funktor<br />
return ist eine natürliche Transformation zwischen der<br />
Identität <strong>und</strong> m<br />
join ist eine natürliche Transformation zwischen m.m <strong>und</strong><br />
m<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Natürliche Transformationen aus Monaden<br />
Sei m::* -> * Monade<br />
Dann ist m ein Funktor<br />
return ist eine natürliche Transformation zwischen der<br />
Identität <strong>und</strong> m<br />
join ist eine natürliche Transformation zwischen m.m <strong>und</strong><br />
m<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Natürliche Transformationen aus Monaden<br />
Sei m::* -> * Monade<br />
Dann ist m ein Funktor<br />
return ist eine natürliche Transformation zwischen der<br />
Identität <strong>und</strong> m<br />
join ist eine natürliche Transformation zwischen m.m <strong>und</strong><br />
m<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Mathematische Definition von Monaden<br />
Sei C eine Kategorie (z.B. Mengen)<br />
Eine Monade besteht aus<br />
einem Funktor T : C → C<br />
einer natürlichen Transformation η : id → T<br />
einer natürlichen Transformation µ : T ◦ T → T<br />
So, dass folgende Regeln gelten:<br />
µ◦η = µ◦(Tη) = id<br />
µ◦µ = µ◦(Tµ)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Mathematische Definition von Monaden<br />
Sei C eine Kategorie (z.B. Mengen)<br />
Eine Monade besteht aus<br />
einem Funktor T : C → C<br />
einer natürlichen Transformation η : id → T<br />
einer natürlichen Transformation µ : T ◦ T → T<br />
So, dass folgende Regeln gelten:<br />
µ◦η = µ◦(Tη) = id<br />
µ◦µ = µ◦(Tµ)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Mathematische Definition von Monaden<br />
Sei C eine Kategorie (z.B. Mengen)<br />
Eine Monade besteht aus<br />
einem Funktor T : C → C<br />
einer natürlichen Transformation η : id → T<br />
einer natürlichen Transformation µ : T ◦ T → T<br />
So, dass folgende Regeln gelten:<br />
µ◦η = µ◦(Tη) = id<br />
µ◦µ = µ◦(Tµ)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Mathematische Definition von Monaden<br />
Sei C eine Kategorie (z.B. Mengen)<br />
Eine Monade besteht aus<br />
einem Funktor T : C → C<br />
einer natürlichen Transformation η : id → T<br />
einer natürlichen Transformation µ : T ◦ T → T<br />
So, dass folgende Regeln gelten:<br />
µ◦η = µ◦(Tη) = id<br />
µ◦µ = µ◦(Tµ)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Mathematische Definition von Monaden<br />
Sei C eine Kategorie (z.B. Mengen)<br />
Eine Monade besteht aus<br />
einem Funktor T : C → C<br />
einer natürlichen Transformation η : id → T<br />
einer natürlichen Transformation µ : T ◦ T → T<br />
So, dass folgende Regeln gelten:<br />
µ◦η = µ◦(Tη) = id<br />
µ◦µ = µ◦(Tµ)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Mathematische Definition von Monaden<br />
Sei C eine Kategorie (z.B. Mengen)<br />
Eine Monade besteht aus<br />
einem Funktor T : C → C<br />
einer natürlichen Transformation η : id → T<br />
einer natürlichen Transformation µ : T ◦ T → T<br />
So, dass folgende Regeln gelten:<br />
µ◦η = µ◦(Tη) = id<br />
µ◦µ = µ◦(Tµ)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Mathematische Definition von Monaden<br />
Sei C eine Kategorie (z.B. Mengen)<br />
Eine Monade besteht aus<br />
einem Funktor T : C → C<br />
einer natürlichen Transformation η : id → T<br />
einer natürlichen Transformation µ : T ◦ T → T<br />
So, dass folgende Regeln gelten:<br />
µ◦η = µ◦(Tη) = id<br />
µ◦µ = µ◦(Tµ)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Mathematische Definition von Monaden<br />
Sei C eine Kategorie (z.B. Mengen)<br />
Eine Monade besteht aus<br />
einem Funktor T : C → C<br />
einer natürlichen Transformation η : id → T<br />
einer natürlichen Transformation µ : T ◦ T → T<br />
So, dass folgende Regeln gelten:<br />
µ◦η = µ◦(Tη) = id<br />
µ◦µ = µ◦(Tµ)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Natürliche Transformationen<br />
Wörterbuch<br />
<strong>Kategorientheorie</strong> <strong>Haskell</strong><br />
Objekt<br />
Datentyp<br />
Morphismus Funktion<br />
Kategorie Typklasse, Menge von Typen<br />
Funktor<br />
Instanz von Functor<br />
η<br />
return<br />
µ join<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Gliederung<br />
1 Monaden<br />
Warum?<br />
Monaden sind Funktoren mit Zusatz<br />
2 Kategorien<br />
Motivation <strong>und</strong> Definition<br />
Beispiele<br />
In <strong>Haskell</strong>?<br />
3 Mehr <strong>Kategorientheorie</strong><br />
Funktoren<br />
Natürliche Transformationen<br />
Adjungierte Funktoren<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Satz aus der linearen Algebra<br />
Satz, 1. Formulierung<br />
Seien V <strong>und</strong> W zwei Vektorräume <strong>und</strong> b 1 ,..., b n eine Basis<br />
von V . Dann ist jede linare Abbildung f : V → W eindeutig<br />
durch f(b 1 ),..., f(b n ) festgelegt <strong>und</strong> jede Wahl der<br />
f(b 1 ),..., f(b n ) kann zu einer linearen Abbildung fortgesetzt<br />
werden.<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Satz aus der linearen Algebra<br />
Satz, 2. Formulierung<br />
Sei W ein Vektorraum, S = {b 1 ,..., b n } eine Menge <strong>und</strong> V der<br />
von S erzeugte Vektorraum. Dann ist jede linare Abbildung<br />
f : V → W eindeutig durch f(b 1 ),..., f(b n ) festgelegt <strong>und</strong> jede<br />
Wahl der f(b 1 ),..., f(b n ) kann zu einer linearen Abbildung<br />
fortgesetzt werden.<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Satz aus der linearen Algebra<br />
Satz, 3. Formulierung<br />
Sei W ein Vektorraum, S = {b 1 ,..., b n } eine Menge <strong>und</strong> K[S]<br />
der von S erzeugte Vektorraum. Dann ist jede linare Abbildung<br />
f : K[S] → W eindeutig durch eine Mengenabbildung S → W<br />
festgelegt <strong>und</strong> jede solche kann zu einer linearen Abbildung<br />
fortgesetzt werden.<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Satz aus der linearen Algebra<br />
Satz, 4. Formulierung<br />
Sei W ein Vektorraum, S = {b 1 ,..., b n } eine Menge <strong>und</strong> K[S]<br />
der von S erzeugte Vektorraum. Die linaren Abbildungen<br />
f : K[S] → W stehen in kanonischer Bijektion zu den<br />
Mengenabbildungen S → W .<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Satz aus der linearen Algebra<br />
Satz, finale Formulierung<br />
Sei W ein Vektorraum, S = {b 1 ,..., b n } eine Menge <strong>und</strong> K[S]<br />
der von S erzeugte Vektorraum. Dann<br />
Mor Set (S, Vergiss(W)) = Mor K−VR (K[S], W)<br />
Vergiss <strong>und</strong> K[_] sind adjungiert.<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Externer Basispunkt <strong>und</strong> Vergessen<br />
_+{0} : Mengen → punktierteMengen<br />
Vergiss : punktierteMengen → Mengen<br />
Mor Set (S, Vergiss(P)) = Mor P−Set (S +{0}, P)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Externer Basispunkt <strong>und</strong> Vergessen<br />
_+{0} : Mengen → punktierteMengen<br />
Vergiss : punktierteMengen → Mengen<br />
Mor Set (S, Vergiss(P)) = Mor P−Set (S +{0}, P)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Externer Basispunkt <strong>und</strong> Vergessen<br />
_+{0} : Mengen → punktierteMengen<br />
Vergiss : punktierteMengen → Mengen<br />
Mor Set (S, Vergiss(P)) = Mor P−Set (S +{0}, P)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Freies Monoid <strong>und</strong> Vergessen<br />
_ ∗ : Mengen → Monoide<br />
Vergiss : Monoide → Mengen<br />
Mor Set (S, Vergiss(M)) = Mor Monoide (S ∗ , M)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Freies Monoid <strong>und</strong> Vergessen<br />
_ ∗ : Mengen → Monoide<br />
Vergiss : Monoide → Mengen<br />
Mor Set (S, Vergiss(M)) = Mor Monoide (S ∗ , M)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Freies Monoid <strong>und</strong> Vergessen<br />
_ ∗ : Mengen → Monoide<br />
Vergiss : Monoide → Mengen<br />
Mor Set (S, Vergiss(M)) = Mor Monoide (S ∗ , M)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Einheit<br />
Es gilt:<br />
Mor Set (S, Vergiss(M)) = Mor Monoide (S ∗ , M)<br />
Setze M = S ∗ :<br />
Mor Set (S, Vergiss(S ∗ )) = Mor Monoide (S ∗ , S ∗ )<br />
Element id rechts, liefert Abbildungη S : S → Vergiss(S ∗ )<br />
links<br />
Das geht für jedes S<br />
Alle Abbildungen zusammen sind natürliche<br />
Transformation η : id → Vergiss(_ ∗ )<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Einheit<br />
Es gilt:<br />
Mor Set (S, Vergiss(M)) = Mor Monoide (S ∗ , M)<br />
Setze M = S ∗ :<br />
Mor Set (S, Vergiss(S ∗ )) = Mor Monoide (S ∗ , S ∗ )<br />
Element id rechts, liefert Abbildungη S : S → Vergiss(S ∗ )<br />
links<br />
Das geht für jedes S<br />
Alle Abbildungen zusammen sind natürliche<br />
Transformation η : id → Vergiss(_ ∗ )<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Einheit<br />
Es gilt:<br />
Mor Set (S, Vergiss(M)) = Mor Monoide (S ∗ , M)<br />
Setze M = S ∗ :<br />
Mor Set (S, Vergiss(S ∗ )) = Mor Monoide (S ∗ , S ∗ )<br />
Element id rechts, liefert Abbildungη S : S → Vergiss(S ∗ )<br />
links<br />
Das geht für jedes S<br />
Alle Abbildungen zusammen sind natürliche<br />
Transformation η : id → Vergiss(_ ∗ )<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Einheit<br />
Es gilt:<br />
Mor Set (S, Vergiss(M)) = Mor Monoide (S ∗ , M)<br />
Setze M = S ∗ :<br />
Mor Set (S, Vergiss(S ∗ )) = Mor Monoide (S ∗ , S ∗ )<br />
Element id rechts, liefert Abbildungη S : S → Vergiss(S ∗ )<br />
links<br />
Das geht für jedes S<br />
Alle Abbildungen zusammen sind natürliche<br />
Transformation η : id → Vergiss(_ ∗ )<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Einheit<br />
Es gilt:<br />
Mor Set (S, Vergiss(M)) = Mor Monoide (S ∗ , M)<br />
Setze M = S ∗ :<br />
Mor Set (S, Vergiss(S ∗ )) = Mor Monoide (S ∗ , S ∗ )<br />
Element id rechts, liefert Abbildungη S : S → Vergiss(S ∗ )<br />
links<br />
Das geht für jedes S<br />
Alle Abbildungen zusammen sind natürliche<br />
Transformation η : id → Vergiss(_ ∗ )<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Funktor + Einheit + ?<br />
Vergiss(_ ∗ ) ist der Funktor, der [] entspricht<br />
η : id → Vergiss(_ ∗ ) ist eine der natürlichen<br />
Transformationen<br />
Wie entsteht µ?<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Funktor + Einheit + ?<br />
Vergiss(_ ∗ ) ist der Funktor, der [] entspricht<br />
η : id → Vergiss(_ ∗ ) ist eine der natürlichen<br />
Transformationen<br />
Wie entsteht µ?<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Funktor + Einheit + ?<br />
Vergiss(_ ∗ ) ist der Funktor, der [] entspricht<br />
η : id → Vergiss(_ ∗ ) ist eine der natürlichen<br />
Transformationen<br />
Wie entsteht µ?<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Koeinheit<br />
Es gilt:<br />
Mor Set (S, Vergiss(M)) = Mor Monoide (S ∗ , M)<br />
Setze S = Vergiss(M):<br />
Mor Set (Vergiss(M), Vergiss(M)) = Mor Monoide (Vergiss(M) ∗ , M)<br />
Element id links, liefert Abbildung ǫ M : Vergiss(M) ∗ → M<br />
links<br />
Das geht für jedes M<br />
Alle Abbildungen zusammen sind natürliche<br />
Transformation ǫ : Vergiss(_) ∗ → id<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Koeinheit<br />
Es gilt:<br />
Mor Set (S, Vergiss(M)) = Mor Monoide (S ∗ , M)<br />
Setze S = Vergiss(M):<br />
Mor Set (Vergiss(M), Vergiss(M)) = Mor Monoide (Vergiss(M) ∗ , M)<br />
Element id links, liefert Abbildung ǫ M : Vergiss(M) ∗ → M<br />
links<br />
Das geht für jedes M<br />
Alle Abbildungen zusammen sind natürliche<br />
Transformation ǫ : Vergiss(_) ∗ → id<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Koeinheit<br />
Es gilt:<br />
Mor Set (S, Vergiss(M)) = Mor Monoide (S ∗ , M)<br />
Setze S = Vergiss(M):<br />
Mor Set (Vergiss(M), Vergiss(M)) = Mor Monoide (Vergiss(M) ∗ , M)<br />
Element id links, liefert Abbildung ǫ M : Vergiss(M) ∗ → M<br />
links<br />
Das geht für jedes M<br />
Alle Abbildungen zusammen sind natürliche<br />
Transformation ǫ : Vergiss(_) ∗ → id<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Koeinheit<br />
Es gilt:<br />
Mor Set (S, Vergiss(M)) = Mor Monoide (S ∗ , M)<br />
Setze S = Vergiss(M):<br />
Mor Set (Vergiss(M), Vergiss(M)) = Mor Monoide (Vergiss(M) ∗ , M)<br />
Element id links, liefert Abbildung ǫ M : Vergiss(M) ∗ → M<br />
links<br />
Das geht für jedes M<br />
Alle Abbildungen zusammen sind natürliche<br />
Transformation ǫ : Vergiss(_) ∗ → id<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Koeinheit<br />
Es gilt:<br />
Mor Set (S, Vergiss(M)) = Mor Monoide (S ∗ , M)<br />
Setze S = Vergiss(M):<br />
Mor Set (Vergiss(M), Vergiss(M)) = Mor Monoide (Vergiss(M) ∗ , M)<br />
Element id links, liefert Abbildung ǫ M : Vergiss(M) ∗ → M<br />
links<br />
Das geht für jedes M<br />
Alle Abbildungen zusammen sind natürliche<br />
Transformation ǫ : Vergiss(_) ∗ → id<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Von der Koeinheit zum Produkt<br />
Habe Abbildung<br />
Das liefert<br />
ǫ M : Vergiss(M) ∗ → M<br />
µ S : Vergiss(Vergiss(S ∗ ) ∗ ) → Vergiss(S ∗ )<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Von der Koeinheit zum Produkt<br />
Habe Abbildung<br />
Das liefert<br />
ǫ M : Vergiss(M) ∗ → M<br />
µ S : Vergiss(Vergiss(S ∗ ) ∗ ) → Vergiss(S ∗ )<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Allgemein<br />
C, D Kategorien<br />
X Objekt in D, Y Objekt in C<br />
F : D → C <strong>und</strong> G : C → D adjungierte Funktoren, also<br />
Mor D (X, F(Y)) = Mor C (G(X), Y)<br />
Das liefert<br />
Funktor FG : C → C<br />
Mor D (X, F(G(X))) = Mor C (G(X), G(X))<br />
Mor D (F(Y), F(Y)) = Mor C (G(F(Y)), Y)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Allgemein<br />
C, D Kategorien<br />
X Objekt in D, Y Objekt in C<br />
F : D → C <strong>und</strong> G : C → D adjungierte Funktoren, also<br />
Mor D (X, F(Y)) = Mor C (G(X), Y)<br />
Das liefert<br />
Funktor FG : C → C<br />
Mor D (X, F(G(X))) = Mor C (G(X), G(X))<br />
Mor D (F(Y), F(Y)) = Mor C (G(F(Y)), Y)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Allgemein<br />
C, D Kategorien<br />
X Objekt in D, Y Objekt in C<br />
F : D → C <strong>und</strong> G : C → D adjungierte Funktoren, also<br />
Mor D (X, F(Y)) = Mor C (G(X), Y)<br />
Das liefert<br />
Funktor FG : C → C<br />
Mor D (X, F(G(X))) = Mor C (G(X), G(X))<br />
Mor D (F(Y), F(Y)) = Mor C (G(F(Y)), Y)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Allgemein<br />
C, D Kategorien<br />
X Objekt in D, Y Objekt in C<br />
F : D → C <strong>und</strong> G : C → D adjungierte Funktoren, also<br />
Mor D (X, F(Y)) = Mor C (G(X), Y)<br />
Das liefert<br />
Funktor FG : C → C<br />
Mor D (X, F(G(X))) = Mor C (G(X), G(X))<br />
Mor D (F(Y), F(Y)) = Mor C (G(F(Y)), Y)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Allgemein<br />
C, D Kategorien<br />
X Objekt in D, Y Objekt in C<br />
F : D → C <strong>und</strong> G : C → D adjungierte Funktoren, also<br />
Mor D (X, F(Y)) = Mor C (G(X), Y)<br />
Das liefert<br />
Funktor FG : C → C<br />
Mor D (X, F(G(X))) = Mor C (G(X), G(X))<br />
Mor D (F(Y), F(Y)) = Mor C (G(F(Y)), Y)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Allgemein<br />
C, D Kategorien<br />
X Objekt in D, Y Objekt in C<br />
F : D → C <strong>und</strong> G : C → D adjungierte Funktoren, also<br />
Mor D (X, F(Y)) = Mor C (G(X), Y)<br />
Das liefert<br />
Funktor FG : C → C<br />
Mor D (X, F(G(X))) = Mor C (G(X), G(X))<br />
Mor D (F(Y), F(Y)) = Mor C (G(F(Y)), Y)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Allgemein<br />
Wir haben<br />
Funktor FG : C → C<br />
Mor D (X, F(G(X))) = Mor C (G(X), G(X))<br />
Mor D (F(Y), F(Y)) = Mor C (G(F(Y)), Y)<br />
Das liefert<br />
Natürliche Transformation η : id → FG<br />
Natürliche Transformation ǫ : GF → id (in D)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Allgemein<br />
Wir haben<br />
Funktor FG : C → C<br />
Mor D (X, F(G(X))) = Mor C (G(X), G(X))<br />
Mor D (F(Y), F(Y)) = Mor C (G(F(Y)), Y)<br />
Das liefert<br />
Natürliche Transformation η : id → FG<br />
Natürliche Transformation ǫ : GF → id (in D)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Allgemein<br />
Wir haben<br />
Funktor FG : C → C<br />
Mor D (X, F(G(X))) = Mor C (G(X), G(X))<br />
Mor D (F(Y), F(Y)) = Mor C (G(F(Y)), Y)<br />
Das liefert<br />
Natürliche Transformation η : id → FG<br />
Natürliche Transformation ǫ : GF → id (in D)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Allgemein<br />
Wir haben<br />
Funktor FG : C → C<br />
Mor D (X, F(G(X))) = Mor C (G(X), G(X))<br />
Mor D (F(Y), F(Y)) = Mor C (G(F(Y)), Y)<br />
Das liefert<br />
Natürliche Transformation η : id → FG<br />
Natürliche Transformation ǫ : GF → id (in D)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Allgemein<br />
Wir haben<br />
Funktor FG : C → C<br />
Mor D (X, F(G(X))) = Mor C (G(X), G(X))<br />
Mor D (F(Y), F(Y)) = Mor C (G(F(Y)), Y)<br />
Das liefert<br />
Natürliche Transformation η : id → FG<br />
Natürliche Transformation ǫ : GF → id (in D)<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Allgemein<br />
Wir haben<br />
Funktor FG : C → C<br />
Natürliche Transformation η : id → FG<br />
Natürliche Transformation ǫ : GF → id (in D)<br />
Das liefert<br />
Natürliche Transformation µ : FGFG → FG<br />
Das ist eine Monade<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Allgemein<br />
Wir haben<br />
Funktor FG : C → C<br />
Natürliche Transformation η : id → FG<br />
Natürliche Transformation ǫ : GF → id (in D)<br />
Das liefert<br />
Natürliche Transformation µ : FGFG → FG<br />
Das ist eine Monade<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Allgemein<br />
Wir haben<br />
Funktor FG : C → C<br />
Natürliche Transformation η : id → FG<br />
Natürliche Transformation ǫ : GF → id (in D)<br />
Das liefert<br />
Natürliche Transformation µ : FGFG → FG<br />
Das ist eine Monade<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Allgemein<br />
Wir haben<br />
Funktor FG : C → C<br />
Natürliche Transformation η : id → FG<br />
Natürliche Transformation ǫ : GF → id (in D)<br />
Das liefert<br />
Natürliche Transformation µ : FGFG → FG<br />
Das ist eine Monade<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Allgemein<br />
Wir haben<br />
Funktor FG : C → C<br />
Natürliche Transformation η : id → FG<br />
Natürliche Transformation ǫ : GF → id (in D)<br />
Das liefert<br />
Natürliche Transformation µ : FGFG → FG<br />
Das ist eine Monade<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Fun Fact<br />
Satz<br />
Alle Monaden entstehen so.<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Beispiele<br />
Maybe entsteht aus externen Basispunkt anfügen <strong>und</strong><br />
vergessen<br />
[] entsteht aus freies Monoid <strong>und</strong> vergessen<br />
Reader?<br />
IO?<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Beispiele<br />
Maybe entsteht aus externen Basispunkt anfügen <strong>und</strong><br />
vergessen<br />
[] entsteht aus freies Monoid <strong>und</strong> vergessen<br />
Reader?<br />
IO?<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Beispiele<br />
Maybe entsteht aus externen Basispunkt anfügen <strong>und</strong><br />
vergessen<br />
[] entsteht aus freies Monoid <strong>und</strong> vergessen<br />
Reader?<br />
IO?<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>
Monaden Kategorien Mehr <strong>Kategorientheorie</strong><br />
Adjungierte Funktoren<br />
Beispiele<br />
Maybe entsteht aus externen Basispunkt anfügen <strong>und</strong><br />
vergessen<br />
[] entsteht aus freies Monoid <strong>und</strong> vergessen<br />
Reader?<br />
IO?<br />
Stefan Mehner<br />
<strong>Haskell</strong> <strong>und</strong> <strong>Kategorientheorie</strong><br />
<strong>Universität</strong> <strong>Bonn</strong>