Monada ou monóide?
A definição técnica é um monóide é um semigrupo com uma identidade. O que não é muito ELI5.
Então: um monóide é “um monte de coisas, e uma coisa que fazemos com essas coisas, que se comporta de forma bastante intuitiva”. O que é vago como o inferno. Mas está destinado a ser. Muito freqüentemente, coisas que se comportam como essa “sensação” como adição.
Como, digamos, empurrar um monte de pilhas de paus juntos.
-
Se eu tenho alguns paus, e os empurro juntos, o que está na pilha? Bastões, certo? Sim.
-
E se eu os enfiar primeiro em pilhas mais pequenas e depois reagrupar essas pilhas à volta delas e depois empurrá-las juntas? Ainda é uma pilha de paus? E se eu enfiar primeiro os paus à esquerda antes de fazer o resto? Sim. É basicamente a mesma pilha de paus? Yup.
-
Se eu tiver um monte de paus e enfiar nenhum paus nele… mudou alguma coisa? Não.
Os dois primeiros são o que faz dele um semigrupo.
#1 é o fecho sob uma operação binária. Claro, há muitos paus, mas eu poderia dividi-lo em dois grupos, ou adicionar um pau de cada vez, ou o que quer que seja. Quando eu opero os sticks usando Shove para juntá-los, eu ainda tenho coisas que são sticks no final. Eles não se transformaram em sapos, eu não os esculpi.
Fire seria não só não binário, mas também não fechado — se eu usar fogo nos paus, eu tenho paus no final? Bem, não, nem por isso. Os paus queimados, claro — o que notavelmente, são paus que tiveram a operação de incêndio neles.
#2 é associatividade. Isso significa que a ordem em que avaliamos as coisas não importa.
#3 é a identidade. Esta é a coisa que é análoga a zero — se você pegá-la, e aplicar sua operação nela e algo, nada muda. Então, Sem Sticks seria aqui.
De uma perspectiva de programação, a concatenação de strings é um bom exemplo de não-matéria.
Qual é a operação binária? Concatenação. Juntando as coisas. (Lembre-se do que eu disse sobre a sensação de adição!) Você opera apenas em duas peças de cada vez. Se você tivesse um milhão de palavras, você ainda o faria adicionando uma à outra, etc. a + b => ab
Está fechado sob essa operação? Fechamento significa “Eu tenho coisas deste tipo, faço alguma coisa e ainda tenho esse tipo no final”. Então, se pegarmos em cordas e as enfiarmos juntas, temos… uma corda longa! Então, sim, é um cordel. Fixe! Então está fechada sob a nossa operação.
É associativo? Sim! E lembrem-se, isto não significa que a ordem não importa, mas que a ordem de avaliação não importa. he + llo
dá o mesmo resultado que h + ello
ou h + el + lo
ou h + (el + lo)
ou (h + el) + lo
ou ((h + (e + l) + l) + o
são todos hello
no final. (Note que ‘a ordem importa’ aqui seria — é he + llo
o mesmo que lh + elo
? Não, hello
não é lhelo
.
Existe uma identidade para esta operação? Yup — a cadeia vazia. apple + ""
é apple
. Ainda é uma cadeia de caracteres. ""
é uma string, também, apenas uma sem nada nela. Então podemos usá-la para a nossa operação, ainda obter uma string — a mesma string com que começámos, de facto!