17.01.2014 Aufrufe

Haskell und Kategorientheorie - Informatik - Universität Bonn

Haskell und Kategorientheorie - Informatik - Universität Bonn

Haskell und Kategorientheorie - Informatik - Universität Bonn

MEHR ANZEIGEN
WENIGER ANZEIGEN

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>

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!