Monád vagy monoid?
A technikai definíció szerint a monoid egy azonossággal rendelkező félcsoport. Ami nem túl ELI5.
Szóval: a monoid “egy csomó dolog, és egy dolog, amit ezzel a dologgal csinálunk, ami elég intuitívan viselkedik”. Ami pokolian homályos. De ez így van értve. Nagyon gyakran az így viselkedő dolgok “úgy érzik”, mintha összeadódnának.
Mintha mondjuk egy csomó pálcikakupacot tolnánk össze.
-
Ha van néhány botom, és összetolom őket, mi van a kupacban? Pálcikák, ugye? Aha.
-
Mi van, ha először kisebb kupacokba lökdösöm őket, majd ezeket a kupacokat úgymond átcsoportosítom maguk körül, és aztán összelökdösöm őket? Akkor is egy halom pálcika lesz belőle? Mi van, ha először a bal oldali pálcikákat tologatom, mielőtt a többit csinálnám? Aha. Ez alapvetően ugyanaz a halom pálca? Igen.
-
Ha van egy csomó pálcám, és rálököm a No Sticks-et… változott valami? Nem.
Az első kettő teszi félcsoporttá.
#1 egy bináris művelet alatti zártság. Persze, rengeteg pálcika van, de feloszthatnám két csoportra, vagy hozzáadhatnék egyszerre egy pálcikát, vagy akármit. Ha a pálcikákon Shove segítségével operálok, hogy összehozzam őket, akkor a végén még mindig maradnak pálcikás dolgok. Nem váltak békává, nem faragtam ki őket.
A tűz nem csak nem bináris, de nem is zárt lenne — ha tüzet használok a pálcákon, akkor is pálcák maradnak a végén? Hát nem, nem igazán. Égett pálcák, persze — ami észrevehetően olyan pálcák, amelyeken a tűz műveletet elvégezték.
#2 az asszociativitás. Ez azt jelenti, hogy nem számít, milyen sorrendben értékeljük a dolgokat.
#3 az azonosság. Ez az a dolog, ami analóg a nullával — ha fogod, és alkalmazod rajta a műveletedet és valamit, semmi sem változik. Tehát No Sticks lenne ez itt.
Programozási szempontból a stringek összekapcsolása egy jó nem matematikai példa.
Mi a bináris művelet? Konkatenáció. A dolgok összekapcsolása. (Emlékezz, mit mondtam az összeadás érzéséről!) Egyszerre csak két darabon operálsz. Ha egymillió szavad lenne, akkor is úgy csinálnád, hogy összeadod az egyiket a másikhoz stb. a + b => ab
Ez a művelet alatt zárt? A zártság azt jelenti, hogy “van ilyen típusú cuccom, csinálok vele valamit, és a végén még megmarad ez a típus”. Tehát, ha stringeket veszünk, és összeragasztjuk őket, akkor… egy hosszú stringet kapunk! Szóval, igen, ez egy string. Király! Tehát zárt a műveletünk alatt.
Asszociatív? Igen! És ne feledd, ez nem azt jelenti, hogy a sorrend nem számít – hanem azt, hogy a kiértékelés sorrendje nem számít. he + llo
ugyanazt az eredményt adja, mintha h + ello
vagy h + el + lo
vagy h + (el + lo)
vagy (h + el) + lo
vagy ((h + (e + l) + l) + o
mind hello
lenne a végén. (Megjegyzendő, hogy a “sorrend számít” itt az lenne — a he + llo
ugyanaz, mint a lh + elo
? Nem, hello
nem lhelo
.
Létezik-e azonosság erre a műveletre? Igen — az üres karakterlánc. apple + ""
az apple
. Még mindig egy karakterlánc. A ""
is egy karakterlánc, csak egy olyan, amiben nincs semmi. Tehát használhatjuk a műveletünkhöz, még mindig egy karakterláncot kapunk — ugyanazt a karakterláncot, amivel kezdtük, valójában!