# Functor

A teoria de categories un functor o funtor és una funció d'una categoria a una altra que porta objectes a objectes i morfismes a morfismes de manera que la composició de morfismes i les identitats es preservin.
Els funtors primer es van considerar a topologia algebraica, on s'associen els objectes algebraics amb els espais topològics i s'associen els homomorfismes algebraics amb funcions contínues. Avui dia, els funtors s'utilitzen a través de les matemàtiques modernes per relacionar diverses categories.
Exemples de functors típics són el funtor fidel (un functor injectiu) i el funtor ple (un functor exhaustiu).
En programació possibilita l'equivalència i substitució de la composició de les aplicacions de cadascun dels morfismes, per l'aplicació de la composició dels morfismes, sovint més ràpida perquè converteix la repetició del recorregut de les estructures afectades per cadascun dels morfismes en un sol recorregut, evitant la creació d'estructures intermèdies, optimització coneguda com a Desforestació.

## Definició

Siguin C i D categories (les categories descriuen estructures i un Monoide de morfismes composables entre els seus valors). Un functor F de C a D és una correspondència que
* associa a cada objecte $X$ de C un objecte $F(X)$ de D,
* associa a cada morfisme $f\colon X\to Y$ en C un morfisme $F(f)\colon F(X)\to F(Y)$ en D tal que s'hi donen les següents condicions:
** $F(\mathrm {id} _{X})=\mathrm {id} _{F(X)}\,\!$ per cada objecte $X$ de C,
** $F(g\circ f)=F(g)\circ F(f)$ per a tot morfisme $f\colon X\to Y\,\!$ i $g\colon Y\to Z$ en C.

### En llenguatge Haskell

En programació en Haskell un Functor es defineix amb una classe de tipus (estructura algebraica) amb les següents característiques
* la correspondència de valors es concreta en l'estructura algebraica representada per l'índex de la classe (F:: Tipus -> Tipus), on F(x), x∈C, podria instanciar-se en una llista [C] o bé un context d'efectes laterals amb resultat del tipus C (IO C).
* la correspondència de morfismes es modela en una funció fmap que associa a una funció (a -> b) el resultat (F a -> F b) que ha de complir els requeriments mencionats més amunt.
Instàncies de Functor són determinats tipus de contenidors, com ara una llista, un vector, però no un conjunt com s'explica més avall, o bé contexts d'efectes com ara IO (efecte global: ent./sortida, vars. globals, excepcions) o també Maybe (efecte semideterminista de les funcions parcials) o bé (Either err) (efecte semideterminista amb indicació de l'error).

## Exemples
### Grup fonamental

El grup fonamental es pot interpretar com un functor entre les categories d'espais topològics puntejats i grups, $\pi _{1}:{\textrm {Top}}_{*}\to {\textrm {Grp}}$. Això és perquè:
* Per cada espai topològic puntejat $(X,x_{0})$, el seu grup fonamental $\pi _{1}(X,x_{0})$ és un grup.
* Cada aplicació contínua $f:(X,x_{0})\to (Y,y_{0})$ indueix un morfisme entre els grups fonamentals respectius, $\pi _{1}(f):\pi _{1}(X,x_{0})\to \pi _{1}(Y,y_{0})$. Explícitament, $\pi _{1}(f)$ envia una classe d'homotopia $[\gamma ]\in \pi _{1}(X,x_{0})$, $\gamma :(S^{1},*)\to (X,x_{0})$, a $[f\circ \gamma ]$.
* Donades aplicacions contínues $f:(X,x_{0})\to (Y,y_{0})$ i $g:(Y,y_{0})\to (Z,z_{0})$, se satisfà que $\pi _{1}(g\circ f)=\pi _{1}(g)\circ \pi _{1}(f)$.
* $\pi _{1}(id_{X})=id_{\pi _{1}(X,x_{0})}$.
De la mateixa manera, els grups d'homotopia elevats $\pi _{n}$ defineixen functors $\pi _{n}:{\textrm {Top}}_{*}\to {\textrm {Ab}}$, per $n\geq 2$.

### Functors oblidadissos

Un functor oblidadís és un functor que s'oblida de certa estructura. Per exemple, el functor oblidadís $U:{\textrm {Vect}}_{k}\to {\textrm {Set}}$ assigna, a cada $k$-espai vectorial $E$, el seu conjunt d'elements, i a cada aplicació lineal $f:E\to F$, ella mateixa vista com a aplicació entre conjunts.
Hi ha un munt de functors oblidadissos. En són exemples:
* ${\textrm {Ring}}\to {\textrm {Ab}}$ que s'oblida del producte intern dels anells i només reté l'estructura additiva (de grup abelià).
* ${\textrm {Top}}\to {\textrm {Set}}$ que s'oblida de la topologia d'un espai topològic i només reté el conjunt de punts.
* ${\textrm {Top}}_{*}\to {\textrm {Top}}$ que s'oblida del punt base, on ${\textrm {Top}}_{*}$ denota la categoria d'espais topològics puntejats.

## Transformació natural entre Functors

Una transformació natural és un homomorfisme entre Functors, que com en tot homomorfisme, manté l'estructura de Functor en transformar el functor origen en el functor destí, preservant l'operació fmap en la imatge de la funció de transformació natural.
Així l'operació fmap en el functor origen seguida de la funció de transf. natural, equival a aplicar fmap en el functor de destí, després d'aplicar la funció de transf. natural, per la definició d'homomorfisme.
Exemple: prenem el functor Maybe com a origen i el functor llista designat '[_]' com a destí i definim maybeToList i comprovarem si l'operació fmap manté el resultat, abans i després de la funció de transformació.
Hi ha un gràfic corresponent al wiki de Haskell.org
Això té aplicació en la comprovació de lleis en les instàncies de les classes de tipus del Haskell.

## Els conjunts no són Functor

El conjunt no compleix les lleis del Functor. Amb base als Enters definim la congruència mòdul 3.
prova que la regla dels Functor no es compleix als conjunts (l'asserció precedent falla!):

## Vegeu també

* Teoria de categories
* Límit d'un functor

## Referències

* ↑ Jacobson, 2009, p. 19, def. 1.2.
* 1 2 La classe Functor(anglès)
* ↑ transformació natural (anglès)