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 Xes 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 fes un endofunctor fijo , no un subconjunto de endofunctores cerrados en composición. Una construcción común es usar fpara generar un monoide tomando el conjunto de kcomposiciones plegadas f^k = f(f(...))de fsí mismo, incluido el k=0que corresponde a la identidad f^0 = id. Y ahora el conjunto Sde todos estos poderes para todos k>=0es 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
Sse puede definir para cualquier functor fo incluso literalmente para cualquier auto-mapa de X. Es el monoide generado por f.
- La estructura monoidal
Sdada por la composición functor y el functor de identidad no tiene nada que ver con fser 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 Bes una categoría, *: B x B-> Bun bifunctor (functor con respecto a cada componente con otro componente fijo ) y ees un objeto unitario que Bsatisface las leyes de asociatividad y unidad:
(a * b) * c = a * (b * c)
a * e = e * a = a
para cualquier objeto a,b,cde B, y las mismas identidades para cualquier morfismo a,b,ccon ereemplazado por id_e, el morfismo de identidad de e. Ahora es instructivo observar que en nuestro caso de interés, donde se Bencuentra la categoría de endofunctores Xcon transformaciones naturales como morfismos, *la composición del functor y eel 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 cen una categoría monoidal (B, *, e)es un objeto Bcon 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 joiny 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 * cpor c^2dónde cestá 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 joiny los returnoperadores 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 muy nuarriba 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 Cde 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 Cen C. Pasando al monoide categorizado, estamos reemplazando el producto cartesiano xcon la composición del functor *, y la operación binaria se reemplaza con la transformación natural mude
c * ca c, que es una colección de joinoperadores
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 returnoperadores
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.