Monada czy monoid?
Definicja techniczna to monoid jest semigrupą z tożsamością. Co nie jest bardzo ELI5.
Więc: monoid to „garść rzeczy, i rzecz, którą robimy z tymi rzeczami, która zachowuje się dość intuicyjnie”. Co jest niejasne jak cholera. Ale tak miało być. Bardzo często rzeczy, które zachowują się w ten sposób, „czują się” jak dodawanie.
Jak, powiedzmy, popychanie kilku stosów patyków razem.
-
Jeśli mam kilka patyków, i popycham je razem, co jest w kupie? Patyki, prawda? Tak.
-
A co jeśli najpierw poukładam je na mniejsze kupki, a potem jakby przegrupuję te kupki wokół siebie i potem popchnę je razem? Czy to nadal jest kupka patyczków? A co jeśli najpierw wepchnę patyczki z lewej strony, zanim zrobię resztę? Yup. Czy to jest w zasadzie ta sama kupka patyczków? Tak.
-
Jeśli mam kupę patyków i wepchnę w nią Żadnych Patyków… czy coś się zmieniło? Nope.
Pierwsze dwa są tym, co sprawia, że jest to półgrupa.
#1 to zamknięcie pod operacją binarną. Jasne, jest dużo patyczków, ale mógłbym je podzielić na dwie grupy, albo dodać jeden patyczek na raz, albo cokolwiek innego. Kiedy operuję na patyczkach używając Shove, aby je połączyć, na końcu nadal mam rzeczy, które są patyczkami. Nie zamieniły się w żaby, nie wyrzeźbiłem ich.
Ogień byłby nie tylko nie-binarny, ale też nie zamknięty — jeśli użyję ognia na patykach, to czy na końcu mam patyki? Cóż, nie, nie bardzo. Spalone patyki, na pewno — co zauważalnie, to patyki, które miały operację ognia na nich.
#2 to asocjatywność. Oznacza to, że kolejność, w jakiej oceniamy rzeczy, nie ma znaczenia.
#3 to tożsamość. To jest rzecz, która jest analogiczna do zera — jeśli weźmiesz ją i zastosujesz na niej swoją operację i coś, nic się nie zmieni. Więc No Sticks byłoby to tutaj.
Z perspektywy programowania, konkatenacja ciągów jest dobrym przykładem nie-matematycznym.
Co to jest operacja binarna? Konkatenacja. Łączenie rzeczy razem. (Pamiętaj, co powiedziałem o uczuciu jak dodawanie!) Operujesz tylko na dwóch elementach naraz. Gdybyś miał milion słów, nadal robiłbyś to dodając jedno do drugiego itd. a + b => ab
Czy to jest zamknięte pod tą operacją? Zamknięcie oznacza „mam rzeczy tego rodzaju, zrób coś z nimi i nadal mam ten typ na końcu”. Tak więc, jeśli weźmiemy ciągi i skleimy je razem, mamy… długi ciąg! Więc, tak, to jest ciąg. Fajnie! Więc jest zamknięty pod naszą operacją.
Czy jest asocjacyjny? Tak! I pamiętaj, to nie znaczy, że kolejność nie ma znaczenia – ale że kolejność oceny nie ma znaczenia. he + llo
daje taki sam wynik jak h + ello
lub h + el + lo
lub h + (el + lo)
lub (h + el) + lo
lub ((h + (e + l) + l) + o
są wszystkie hello
na końcu. (Zauważ, że „kolejność ma znaczenie” tutaj byłoby — czy he + llo
jest takie samo jak lh + elo
? Nope, hello
nie jest lhelo
.
Is there an identity for this operation? Yup — pusty ciąg. apple + ""
jest apple
. Nadal jest to ciąg. ""
też jest łańcuchem, tylko bez niczego w nim. Więc możemy użyć go do naszej operacji, wciąż otrzymując łańcuch — ten sam łańcuch, z którym zaczęliśmy, w rzeczywistości!