Begriff
Functor Category
Warum wichtig?
Dieser Begriff ist ein Knoten im SengakujiWorks-Wissensnetz. Nutze Level 0 für die erste Einordnung, Level 1 für Praxis, Level 2 für technische Struktur und Level 3 für Grenzen, Fallstricke und Expertenkontext.
Kategorie A hat Objekte und Pfeile. Kategorie B hat Objekte und Pfeile. Ein Funktor F bildet A auf B ab (Objekt zu Objekt, Pfeil zu Pfeil). Was passiert, wenn wir alle Funktoren von A nach B betrachten? Sie bilden selbst eine Kategorie: Die Funktorkategorie ($B^A$ oder $[A, B]$). Die "Objekte" dieser Super-Kategorie sind die Funktoren. Die "Pfeile" zwischen den Funktoren sind Natürliche Transformationen. Das ist Abstraktion Level 9000. Aber in der Programmierung sind das einfach High-Order Functions oder Generics.
Merksatz: Eine Kategorie, deren Objekte Funktoren (zwischen zwei festen Kategorien) und deren Morphismen natürliche Transformationen zwischen diesen Funktoren sind.
In Haskell.
Stell dir eine Datenstruktur vor, die einen Typ a hält. F a.
Stell dir eine andere vor G a.
Ein Pfeil zwischen F und G (für alle a) ist eine Funktion wie safeHead : List a -> Option a.
Das ist eine natürliche Transformation in der Funktorkategorie der Haskell-Typen.
1. Presheaves
Eine spezielle Funktorkategorie: $Set^{C^{op}}$. Funktoren von einer Kategorie $C$ (umgedreht) in die Kategorie der Mengen. Das ist die Basis der Topos-Theorie. Man kann damit Logiken bauen, die "lokal" gelten (Zeit-abhängige Wahrheit).
2. Diagramme
In der Kategorientheorie redet man oft von "Diagrammen". Ein Diagramm ist einfach ein Funktor von einer kleinen Index-Kategorie $J$ in deine Kategorie $C$. Der Limes (Limit) dieses Diagramms wird in der Funktorkategorie $C^J$ definiert.
1. Das Yoneda-Lemma
In der Funktorkategorie $[C, Set]$ (Presheaves) gibt es das berühmteste Resultat der Kategorientheorie: das Yoneda-Lemma.
Es besagt, dass ein Objekt $c \in C$ vollständig durch die Funktoren charakterisiert wird, die es in andere Objekte abbilden.
Für die Softwareentwicklung bedeutet das: "Du musst nicht wissen, was ein Objekt ist, sondern nur, wie es mit allen anderen Objekten interagiert." In der Praxis (z. B. Haskell Control.Lens) erlaubt dies die Konstruktion von "universellen" Schnittstellen, die funktionieren, ohne den inneren Datentyp zu kennen.
2. Adjunktionen in Funktorkategorien
Funktorkategorien erlauben es, Adjunktionen (Paare von Funktoren, die "fast" invers sind) auf einer höheren Ebene zu betrachten.
Wenn zwei Kategorien $C$ und $D$ adjungiert sind, induziert dies automatisch Adjunktionen zwischen den entsprechenden Funktorkategorien $[J, C]$ und $[J, D]$.
Dies ist die mathematische Basis für das Lifting. Wenn wir wissen, wie man eine Listen-Transformation verifiziert, "liftet" die Theorie dies automatisch auf die Ebene von Funktoren über Listen (wie map oder filter), ohne dass wir den Beweis für jeden Anwendungsfall neu schreiben müssen.
3. Exponential Objects & Currying
Die Funktorkategorie $[A, B]$ wird oft als $B^A$ geschrieben. Das ist kein Zufall. In einer Cartesian Closed Category (CCC), wie sie der Lambda-Kalkül darstellt, ist die Funktorkategorie das "Exponential Object". Die Isomorphie $C^{A \times B} \cong (C^B)^A$ ist exakt das Currying in der Programmierung: Eine Funktion mit zwei Argumenten ist das Gleiche wie eine Funktion, die eine Funktion zurückgibt. Funktorkategorien sind also der formale Ort, an dem Funktionen "First-Class Citizens" werden.
Quick-Check
Warum so kompliziert?
Weil Mathematiker Muster sehen wollen. "Funktionen zwischen Mengen" ist das gleiche wie "Natürliche Transformationen zwischen Funktoren". Es vereinheitlicht die Sichtweise.Exponentielle Notation?
$B^A$. Das erinnert an $y^x$ (Funktionen von x nach y). Tatsächlich verhalten sich Funktorkategorien wie Exponenten (Exponential Objects) in einer Cartesian Closed Category.Programmierung?
Free Monads, Lenses, Optics – all das moderne funktionale Zeug basiert auf Funktorkategorien.