Monade o monoide?
La definizione tecnica è un monoide è un semigruppo con un’identità. Che non è molto ELI5.
Quindi: un monoide è “un mucchio di roba, e una cosa che facciamo con quella roba, che si comporta in modo abbastanza intuitivo”. Il che è molto vago. Ma è pensato per esserlo. Molto frequentemente, le cose che si comportano così “si sentono” come l’addizione.
Come, per esempio, spingere insieme un mucchio di bastoncini.
-
Se ho dei bastoncini, e li spingo insieme, cosa c’è nel mucchio? Bastoni, giusto? Sì.
-
E se li spingo prima in mucchi più piccoli e poi raggruppo quei mucchi intorno a se stessi e poi li spingo insieme? È ancora un mucchio di bastoncini? E se spingo i bastoncini a sinistra prima di fare il resto? Sì. È fondamentalmente lo stesso mucchio di bastoncini? Sì.
-
Se ho un mucchio di bastoncini e ci ficco No Sticks… è cambiato qualcosa? No.
I primi due sono ciò che lo rende un semigruppo.
#1 è la chiusura sotto un’operazione binaria. Certo, ci sono molti bastoncini, ma potrei dividerlo in due gruppi, o aggiungere un bastoncino alla volta, o qualsiasi altra cosa. Quando opero sui bastoncini usando Shove per metterli insieme, ho ancora cose che sono bastoncini alla fine. Non si sono trasformati in rane, non li ho intagliati.
Il fuoco sarebbe non solo non binario, ma anche non chiuso — se uso il fuoco sui bastoncini, ho dei bastoncini alla fine? Beh, no, non proprio. Bastoni bruciati, certo — che, si noti, sono bastoni che hanno avuto l’operazione del fuoco su di loro.
#2 è associatività. Questo significa che l’ordine in cui valutiamo le cose non ha importanza.
#3 è l’identità. Questa è la cosa che è analoga allo zero – se lo prendi, e applichi la tua operazione su di esso e qualcosa, non cambia nulla. Quindi No Sticks sarebbe qui.
Da una prospettiva di programmazione, la concatenazione di stringhe è un buon esempio non-matematico.
Qual è l’operazione binaria? La concatenazione. Unire le cose insieme. (Ricordate quello che ho detto sulla sensazione di addizione!) Si opera solo su due pezzi alla volta. Se tu avessi un milione di parole, lo faresti comunque aggiungendone una all’altra ecc. a + b => ab
Si chiude sotto questa operazione? Chiusura significa “ho roba di questo tipo, ci faccio qualcosa e alla fine ho ancora quel tipo”. Quindi, se prendiamo delle stringhe e le incolliamo insieme, abbiamo… una lunga stringa! Quindi, sì, è una stringa. Forte! Quindi è chiusa sotto la nostra operazione.
È associativa? Sì! E ricordate, questo non significa che l’ordine non conta – ma che l’ordine di valutazione non conta. he + llo
dà lo stesso risultato di h + ello
o h + el + lo
o h + (el + lo)
o (h + el) + lo
o ((h + (e + l) + l) + o
sono tutti hello
alla fine. (Notate che “l’ordine ha importanza” qui sarebbe — he + llo
è lo stesso di lh + elo
? No, hello
non è lhelo
.
C’è un’identità per questa operazione? Sì, la stringa vuota. apple + ""
è apple
. Ancora una stringa. Anche ""
è una stringa, solo una senza niente dentro. Quindi possiamo usarla per la nostra operazione, ottenendo ancora una stringa — la stessa stringa con cui abbiamo iniziato, infatti!
.