Las respuestas aquí hacen un excelente trabajo al definir tanto monoides como mónadas, sin embargo, todavía no parecen responder la pregunta:
Y en una nota menos importante, ¿es esto cierto y, de ser así, podría dar una explicación (con suerte, una que pueda entender alguien que no tenga mucha experiencia con Haskell)?
El quid de la cuestión que falta aquí es la noción diferente de "monoide", la denominada categorización más precisamente: la de monoide en una categoría monoidal. Lamentablemente, el libro de Mac Lane lo hace muy confuso :
En total, una mónada X
es solo un monoide en la categoría de endofunctores de X
, con el producto ×
reemplazado por la composición de endofunctores y la unidad establecida por el endofunctor de identidad.
Confusión principal
¿Por qué es esto confuso? Porque no define qué es "monoide en la categoría de endofunctores" de X
. En cambio, esta oración sugiere tomar un monoide dentro del conjunto de todos los endofunctores junto con la composición del functor como operación binaria y el functor de identidad como una unidad monoidal. Que funciona perfectamente bien y convierte en un monoide cualquier subconjunto de endofunctores que contiene el functor de identidad y está cerrado bajo la composición del functor.
Sin embargo, esta no es la interpretación correcta, que el libro no deja en claro en esa etapa. Una mónada f
es un endofunctor fijo , no un subconjunto de endofunctores cerrados en composición. Una construcción común es usar f
para generar un monoide tomando el conjunto de k
composiciones plegadas f^k = f(f(...))
de f
sí mismo, incluido el k=0
que corresponde a la identidad f^0 = id
. Y ahora el conjunto S
de todos estos poderes para todos k>=0
es de hecho un monoide "con producto × reemplazado por composición de endofunctores y unidad establecida por el endofunctor de identidad".
Y todavía:
- Este monoide
S
se puede definir para cualquier functor f
o incluso literalmente para cualquier auto-mapa de X
. Es el monoide generado por f
.
- La estructura monoidal
S
dada por la composición functor y el functor de identidad no tiene nada que ver con f
ser o no ser una mónada.
Y para hacer las cosas más confusas, la definición de "monoide en la categoría monoidal" aparece más adelante en el libro, como puede ver en la tabla de contenido . Y, sin embargo, comprender esta noción es absolutamente fundamental para comprender la conexión con las mónadas.
Categorías (estrictas) monoidales
Pasando al Capítulo VII sobre Monoides (que viene después del Capítulo VI sobre Mónadas), encontramos la definición de la llamada categoría monoidal estricta como triple (B, *, e)
, donde B
es una categoría, *: B x B-> B
un bifunctor (functor con respecto a cada componente con otro componente fijo ) y e
es un objeto unitario que B
satisface las leyes de asociatividad y unidad:
(a * b) * c = a * (b * c)
a * e = e * a = a
para cualquier objeto a,b,c
de B
, y las mismas identidades para cualquier morfismo a,b,c
con e
reemplazado por id_e
, el morfismo de identidad de e
. Ahora es instructivo observar que en nuestro caso de interés, donde se B
encuentra la categoría de endofunctores X
con transformaciones naturales como morfismos, *
la composición del functor y e
el functor de identidad, se cumplen todas estas leyes, como puede verificarse directamente.
Lo que viene después en el libro es la definición de la categoría monoidal "relajada" , donde las leyes solo contienen algunas transformaciones naturales fijas que satisfacen las llamadas relaciones de coherencia , lo que sin embargo no es importante para nuestros casos de las categorías de endofunctores.
Monoides en categorías monoidales
Finalmente, en la sección 3 "Monoides" del Capítulo VII, se da la definición real:
Un monoide c
en una categoría monoidal (B, *, e)
es un objeto B
con dos flechas (morfismos)
mu: c * c -> c
nu: e -> c
Haciendo 3 diagramas conmutativos. Recordemos que en nuestro caso, estos son morfismos en la categoría de endofunctores, que son transformaciones naturales correspondientes a una mónada join
y precisamente return
. La conexión se vuelve aún más clara cuando hacemos que la composición sea *
más explícita, reemplazando c * c
por c^2
dónde c
está nuestra mónada.
Finalmente, observe que los 3 diagramas conmutativos (en la definición de un monoide en la categoría monoidal) están escritos para categorías monoidales generales (no estrictas), mientras que en nuestro caso todas las transformaciones naturales que surgen como parte de la categoría monoidal son en realidad identidades. Eso hará que los diagramas sean exactamente iguales a los de la definición de una mónada, completando la correspondencia.
Conclusión
En resumen, cualquier mónada es, por definición, un endofunctor, por lo tanto, un objeto en la categoría de endofunctores, donde el monádico join
y los return
operadores satisfacen la definición de un monoide en esa categoría monoidal particular (estricta) . Viceversa, cualquier monoide en la categoría monoidal de endofunctores es, por definición, un triple que (c, mu, nu)
consiste en un objeto y dos flechas, por ejemplo, transformaciones naturales en nuestro caso, que satisfacen las mismas leyes que una mónada.
Finalmente, observe la diferencia clave entre los monoides (clásicos) y los monoides más generales en categorías monoidales. Las dos flechas mu
y nu
arriba ya no son una operación binaria y una unidad en un conjunto. En cambio, tiene un endofunctor fijo c
. La composición del functor *
y el functor de identidad por sí solos no proporcionan la estructura completa necesaria para la mónada, a pesar de esa observación confusa en el libro.
Otro enfoque sería comparar con el monoide estándar C
de todos los auto-mapas de un conjunto A
, donde la operación binaria es la composición, que se puede ver a mapear el producto cartesiano estándar C x C
en C
. Pasando al monoide categorizado, estamos reemplazando el producto cartesiano x
con la composición del functor *
, y la operación binaria se reemplaza con la transformación natural mu
de
c * c
a c
, que es una colección de join
operadores
join: c(c(T))->c(T)
para cada objeto T
(escriba en la programación). Y los elementos de identidad en monoides clásicos, que pueden identificarse con imágenes de mapas de un conjunto fijo de un punto, se reemplazan con la colección de return
operadores
return: T->c(T)
Pero ahora no hay más productos cartesianos, por lo que no hay pares de elementos y, por lo tanto, no hay operaciones binarias.