As respostas aqui fazem um excelente trabalho na definição de monóides e mônadas, no entanto, elas ainda não parecem responder à pergunta:
E, em uma nota menos importante, isso é verdade e, em caso afirmativo, você poderia dar uma explicação (espero que possa ser entendida por alguém que não tenha muita experiência com Haskell)?
O cerne da questão que falta aqui é a noção diferente de "monóide", a chamada categorização mais precisamente - a de monóide em uma categoria monoidal. Infelizmente, o próprio livro de Mac Lane o torna muito confuso :
No total, uma mônada X
é apenas um monóide na categoria de endofunitores de X
, com o produto ×
substituído pela composição dos endofunitores e a unidade definida pelo endofuncor de identidade.
Confusão principal
Por que isso é confuso? Porque não define o que é "monóide na categoria de endofunitores" de X
. Em vez disso, essa sentença sugere levar um monóide dentro do conjunto de todos os endofunitores junto com a composição do functor como operação binária e o functor de identidade como uma unidade monoidal. O que funciona perfeitamente bem e transforma em monóide qualquer subconjunto de endofunitores que contém o functor de identidade e é fechado na composição do functor.
No entanto, essa não é a interpretação correta, que o livro deixa de esclarecer nessa fase. Uma Mônada f
é um endofuncor fixo , não um subconjunto de endofuncores fechado sob composição. Uma construção comum é a utilização f
para gerar uma monóide, tendo o conjunto de todas as k
composições vezes de f^k = f(f(...))
de f
com ele mesmo, incluindo k=0
que corresponde à identidade f^0 = id
. E agora o conjunto S
de todos esses poderes para todos k>=0
é de fato um monóide "com o produto × substituído pela composição dos endofunitores e pela unidade definida pelo endofuncor de identidade".
E ainda:
- Este monóide
S
pode ser definido para qualquer functor f
ou mesmo literalmente para qualquer auto-mapa de X
. É o monóide gerado por f
.
- A estrutura monoidal
S
dada pela composição do functor e pelo functor de identidade não tem nada a ver com f
ser ou não ser uma mônada.
E para tornar as coisas mais confusas, a definição de "monóide na categoria monoidal" vem mais adiante neste livro, como você pode ver no índice . E, no entanto, entender essa noção é absolutamente crítico para entender a conexão com as mônadas.
Categorias monoidais (estritas)
Indo para o capítulo VII sobre monóides (que vem depois do capítulo VI sobre mônadas), encontramos a definição da chamada categoria monoidal estrita como tripla (B, *, e)
, onde B
é uma categoria, *: B x B-> B
um bifunctor (functor em relação a cada componente com outro componente fixo) ) e e
é um objeto de unidade que B
satisfaz as leis de associatividade e de unidade:
(a * b) * c = a * (b * c)
a * e = e * a = a
para quaisquer objetos a,b,c
de B
, e as mesmas identidades para qualquer morphisms a,b,c
com e
substituídas por id_e
, o morfismo identidade e
. Agora é instrutivo observar que, no nosso caso de interesse, onde B
está a categoria de endofundeiros X
com transformações naturais como morfismos, *
composição de functor e e
functor de identidade, todas essas leis são cumpridas, como podem ser verificadas diretamente.
O que vem depois no livro é a definição da categoria monoidal "relaxada" , em que as leis mantêm apenas algumas transformações naturais fixas que satisfazem as chamadas relações de coerência , o que, no entanto, não é importante para os nossos casos das categorias de endofuncores.
Monoides em categorias monoidais
Finalmente, na seção 3 "Monoids" do capítulo VII, a definição real é dada:
Um monóide c
em uma categoria monoidal (B, *, e)
é um objeto B
com duas setas (morfismos)
mu: c * c -> c
nu: e -> c
fazendo 3 diagramas comutativos. Lembre-se que, no nosso caso, estes são morphisms na categoria de endofunctors, que são transformações naturais correspondentes a precisão join
e return
para uma mônada. A conexão se torna ainda mais clara quando tornamos a composição *
mais explícita, substituindo c * c
por c^2
onde c
está nossa mônada.
Finalmente, observe que os três diagramas comutativos (na definição de um monóide na categoria monoidal) são escritos para categorias monoidais gerais (não estritas), enquanto no nosso caso todas as transformações naturais que surgem como parte da categoria monoidal são na verdade identidades. Isso tornará os diagramas exatamente iguais aos da definição de mônada, completando a correspondência.
Conclusão
Em resumo, qualquer mônada é, por definição, um endofuncor, portanto, um objeto na categoria de endofunitores, em que o monádico join
e os return
operadores satisfazem a definição de um monóide nessa categoria monoidal (estrita) específica . Vice-versa, qualquer monóide na categoria monoidal de endofuncores é, por definição, um triplo que (c, mu, nu)
consiste em um objeto e duas setas, por exemplo, transformações naturais em nosso caso, que cumprem as mesmas leis que uma mônada.
Finalmente, observe a principal diferença entre os monóides (clássicos) e os monóides mais gerais nas categorias monoidais. As duas setas mu
e nu
acima não são mais uma operação binária e uma unidade em um conjunto. Em vez disso, você tem um endofunctor fixo c
. A composição do functor *
e o functor de identidade por si só não fornecem a estrutura completa necessária para a mônada, apesar dessa observação confusa no livro.
Outra abordagem seria para comparar com o monoid padrão C
de todas as auto-aplicações de um conjunto A
, onde a operação binária é a composição, que pode ser visto para mapear o produto cartesiano padrão C x C
em C
. Passando para o monóide categorizado, estamos substituindo o produto cartesiano x
pela composição de functor *
e a operação binária é substituída pela transformação natural mu
de
c * c
para c
, que é uma coleção de join
operadores
join: c(c(T))->c(T)
para cada objeto T
(digite na programação). E os elementos de identidade nos monoides clássicos, que podem ser identificados com imagens de mapas de um conjunto fixo de um ponto, são substituídos pela coleção dos return
operadores
return: T->c(T)
Mas agora não há mais produtos cartesianos, portanto não há pares de elementos e, portanto, nenhuma operação binária.