¿Mónada o monoide?
La definición técnica es que un monoide es un semigrupo con identidad. Lo cual no es muy ELI5.
Entonces: un monoide es «un montón de cosas, y una cosa que hacemos con esas cosas, que se comporta bastante intuitivamente». Lo cual es muy vago. Pero tiene la intención de serlo. Con mucha frecuencia, las cosas que se comportan así «se sienten» como una adición.
Como, por ejemplo, empujar un montón de palos juntos.
-
Si tengo algunos palos, y los empujo juntos, ¿qué hay en el montón? Palos, ¿verdad? Sí.
-
¿Y si primero los meto en montones más pequeños y luego reagrupo esos montones en torno a sí mismos y los meto juntos? ¿Sigue siendo un montón de palos? ¿Y si empujo primero los palos de la izquierda antes de hacer el resto? Sí. ¿Es básicamente el mismo montón de palos? Sip.
-
Si tengo un montón de palos y le meto No Sticks… ¿cambia algo? Nop.
Los dos primeros son los que lo convierten en un semigrupo.
#1 es el cierre bajo una operación binaria. Claro, hay muchos palos, pero podría dividirlo en dos grupos, o añadir un palo a la vez, o lo que sea. Cuando opero en los palos usando Shove para juntarlos, todavía tengo cosas que son palos al final. No se han convertido en ranas, no las he tallado.
El fuego no sólo no sería binario, sino que tampoco estaría cerrado — si uso el fuego en los palos, ¿tengo palos al final? Pues no, la verdad es que no. Palos quemados, seguro — que notablemente, son palos que han tenido la operación de fuego en ellos.
#2 es asociatividad. Eso significa que el orden en que evaluamos las cosas no importa.
#3 es la identidad. Esta es la cosa que es análoga a cero – si usted lo toma, y aplicar su operación en él y algo, nada cambia. Así que No Sticks sería aquí.
Desde una perspectiva de programación, la concatenación de cadenas es un buen ejemplo no matemático.
¿Cuál es la operación binaria? Concatenación. Unir cosas. (¡Recuerda lo que dije sobre la sensación de adición!) Sólo operas con dos piezas a la vez. Si tuvieras un millón de palabras, seguirías haciéndolo sumando una con otra, etc. a + b => ab
¿Se cierra bajo esa operación? Cierre significa «tengo cosas de este tipo, le hago algo y sigo teniendo ese tipo al final». Entonces, si tomamos cadenas y las pegamos, tenemos… ¡una cadena larga! Así que, sí, es una cadena. ¡Genial! Así que está cerrado bajo nuestra operación.
¿Es asociativo? Sí. Y recuerda que esto no significa que el orden no importe, sino que el orden de evaluación no importa. he + llo
da el mismo resultado que h + ello
o h + el + lo
o h + (el + lo)
o (h + el) + lo
o ((h + (e + l) + l) + o
son todos hello
al final. (Nótese que «el orden sí importa» aquí sería — ¿es he + llo
lo mismo que lh + elo
? No, hello
no es lhelo
.
¿Hay una identidad para esta operación? Sí… la cadena vacía. apple + ""
es apple
. Sigue siendo una cadena. ""
es una cadena, también, sólo que sin nada en ella. Así que podemos usarlo para nuestra operación, y aún así obtener una cadena — ¡la misma cadena con la que empezamos, de hecho!