You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardexpand all lines: TFG.tex
+81-6
Original file line number
Diff line number
Diff line change
@@ -447,6 +447,25 @@ \subsection{Functores en Haskell}
447
447
\end{minted}
448
448
\end{example}
449
449
450
+
\section{Diagramas y conos}
451
+
En estas páginas hemos trabajado a menudo con categorías con infinitos objetos e innumerables morfismos.
452
+
Sin embargo, resulta de interés estudiar una estructura particular de objetos y morfismos que podamos encontrar dentro de esa categoría.
453
+
Para ello, formalizaremos un concepto que hemos manejado antes, los diagramas.
454
+
\begin{definition}
455
+
Sean $\cat$ y $\mathcal{I}$ dos categorías. Un \emph{diagrama} de $\cat$ con \emph{forma} $\mathcal{I}$ es un functor $D \colon\mathcal{I} \to\cat$.
456
+
\end{definition}
457
+
Es decir, técnicamente \emph{diagrama} será sólo otra palabra para \emph{functor}.
458
+
En la práctica, usaremos \emph{diagrama} cuando querramos distinguir una estructura particular dentro de una categoría.
459
+
Esa estructura estará expresada en la forma del diagrama, $\mathcal{I}$ en la definición.
460
+
461
+
\begin{example}
462
+
Sea $\mathcal{I}$ la siguiente categoría:
463
+
\[\begin{tikzcd}
464
+
A & B \arrow[l,"\leftarrow"] \arrow[r,"\rightarrow"] & C
465
+
\end{tikzcd} \]
466
+
Entonces el diagrama $D \colon\mathcal{I} \to\cat$ es llamado \emph{span}.
467
+
\end{example}
468
+
450
469
\section{Construcciones universales}
451
470
Podemos caracterizar ciertos objetos en una categoría por alguna propiedad especial que cumplan. En lugar de pedir que sólo haya un objeto que cumpla dicha propiedad, nos limitamos a pedir que todos los objetos que cumplan la propiedad sean isomorfos. Estas propiedades son llamadas \emph{propiedades universales}.
452
471
@@ -492,7 +511,7 @@ \chapter{F-álgebras}
492
511
La igualdad de estos dos morfismos nos dará la fundación de la categoría de $F$-álgebras.
493
512
Es más, como estos morfismos preservan bien la estructura de $F$-álgebran, les daremos el nombre (honorífico) de $F$-homomorfismo:
494
513
495
-
\begin{proposition}
514
+
\begin{proposition}\label{prop:fmorfismo}
496
515
Sea $\cat$ una categoría y $F$ un endomorfismo en $\cat$.
497
516
Sea $Alg_F$ la colección de $F$-álgebras con homomorfismos $f \colon (A,\alpha) \to (B,\beta)$ tal que:
498
517
\begin{itemize}
@@ -556,14 +575,70 @@ \chapter{F-álgebras}
556
575
Luego $\alpha$ tiene inversa y debe ser isomorfismo.
557
576
\end{proof}
558
577
559
-
El homomorfismo $u$ de la demostración recibe el imponente nombre de \emph{catamorfismo}.
578
+
Dado un $F$-álgebra inicial $(A,\alpha)$, para todo otro $F$-áĺgebra $(B,\beta)$, al homomorfismo único de $(A,\alpha)$ a $(B,\beta)$ le daremos el imponente nombre de \emph{catamorfismo}.
579
+
Por ejemplo, el homomorfismo $u$ de la demostración era un catamorfismo a $(F A, F \alpha)$.
560
580
561
581
\section{Catamorfismos en Haskell}
562
582
563
-
Para ilustrar la utilidad de los catamorfismos, vamos a construir una álgebra inicial en \code{Hask} sobre el functor \code{[]} (listas).
564
-
En este caso, un \code{[]}-álgebra será un par \code{(a,alpha)} donde \code{alpha :: [a] -> a}.
565
-
Digamos que \code{a = Int}
566
-
Para que esta $F$-álgebra sea inicial, necesitamos un \code{cat :: Int -> [Int]} que sea la inversa de \code{alpha}.
583
+
Debemos empezar implementando álgebras en Haskell:
584
+
\begin{minted}{haskell}
585
+
type Algebra f a = f a -> a
586
+
\end{minted}
587
+
Hay que tener en cuenta que no estamos imponiendo que \code{f} sea un functor, ya que Haskell no permite imponer restricciones a constructores de datos sin recurrir a GADTs\footnote{\url{https://wiki.haskell.org/Data_declaration_with_constraint}}.
588
+
589
+
Lo siguiente que necesitamos es implementar el punto fijo de \code{f}:
590
+
\begin{minted}{haskell}
591
+
newtype Fix f = U (f (Fix f))
592
+
\end{minted}
593
+
Como \code{Fix} tiene un único constructor, hay un isomorfismo entre \code{Fix f} y \code{f (Fix f)}.
594
+
Este isomorfismo es \code{U}, y su inversa es:
595
+
\begin{minted}{haskell}
596
+
unFix :: Fix f -> f (Fix f)
597
+
unFix (U f) = f
598
+
\end{minted}
599
+
600
+
Ahora que sabemos que (\code{Fix f}, \code{U}) es el álgebra inicial, sabemos que existe un catamorfismo de este álgebra a todas las demás álgebras.
601
+
Consideramos cualquier otra álgebra (\code{b}, \code{g}), con \code{g :: Algebra f b}. sea \code{m :: Fix f -> b} el correspondiente catamorfismo, entonces por \ref{prop:fmorfismo}:
602
+
603
+
\[
604
+
\begin{tikzcd}
605
+
{f (Fix f)} \arrow[r,"fmap\ m"] \arrow[d,"U"] & f b \arrow[d,"g"]\\
606
+
{Fix f} \arrow[r,"m"] & b
607
+
\end{tikzcd}
608
+
\]
609
+
610
+
Podemos invertir \code{U} con \code{unFix}, luego la conmutatividad del diagrama es equivalente a que:
611
+
\begin{minted}{haskell}
612
+
m = g . fmap m . unFix
613
+
\end{minted}
614
+
Usamos esto para definir recursivamente el catamorfismo:
615
+
\begin{minted}{haskell}
616
+
cata :: (Functor f) => (Algebra f b) -> (Fix f -> b)
617
+
cata g = g . fmap (cata g) . unFix
618
+
\end{minted}
619
+
620
+
Veamos un ejemplo con el functor \code{Maybe}
621
+
\begin{example}
622
+
Especialicemos el código anterior para \code{Maybe}:
623
+
\begin{minted}{haskell}
624
+
type AlgebraM a = Algebra Maybe a
625
+
type FixM = Fix Maybe
626
+
\end{minted}
627
+
Por ahora, no dice mucho. Pero al añadir las siguientes de líneas obtenemos una perspectiva interesante:
628
+
\begin{minted}{haskell}
629
+
type Nat = FixM
630
+
631
+
cero :: Nat
632
+
cero = U Nothing
633
+
suc :: Nat -> Nat
634
+
suc = U . Just
635
+
\end{minted}
636
+
Es decir, los naturales pueden verse como el punto fijo del functor \code{Maybe}.
637
+
\end{example}
638
+
%Para ilustrar la utilidad de los catamorfismos, vamos a construir una álgebra inicial en \code{Hask} sobre el functor \code{[]} (listas).
639
+
%En este caso, un \code{[]}-álgebra será un par \code{(a,alpha)} donde \code{alpha :: [a] -> a}.
640
+
%Digamos que \code{a = Int}
641
+
%Para que esta $F$-álgebra sea inicial, necesitamos un \code{cat :: Int -> [Int]} que sea la inversa de \code{alpha}.
0 commit comments