Monadi vai monoidi?
Tekninen määritelmä on, että monoidi on puolijoukko, jolla on identiteetti. Mikä ei ole kovin ELI5.
Siinä: monoidi on ”joukko tavaraa ja asia, jonka teemme tuolla tavaralla, joka käyttäytyy melko intuitiivisesti”. Mikä on helvetin epämääräistä. Mutta sen on tarkoitus olla. Hyvin usein asiat, jotka käyttäytyvät näin, ”tuntuvat” yhteenlaskuilta.
Kuten vaikkapa kasan tikkupinojen tunkeminen yhteen.
-
Jos minulla on keppejä ja tönäisen ne yhteen, mitä kasassa on? Tikkuja, eikö niin? Jep.
-
Mitä jos työnnän ne ensin pienempiin kasoihin ja sitten tavallaan ryhmittelen nuo kasat uudelleen itsensä ympärille ja sitten työnnän ne yhteen? Onko se silti kasa tikkuja? Entä jos tönäisen ensin vasemmalla olevat tikut ennen kuin teen loput? Jep. Onko se periaatteessa sama kasa tikkuja? Jep.
-
Jos minulla on kasa tikkuja ja tönäisen siihen Ei tikkuja… muuttuiko mikään? Ei.
Kaksi ensimmäistä tekevät siitä puoliryhmän.
#1 on sulkeutuminen binäärioperaation alla. Toki tikkuja on paljon, mutta voisin jakaa sen kahteen ryhmään, tai lisätä yhden tikun kerrallaan, tai mitä tahansa. Kun operoin tikkuja käyttäen Shovea niiden yhdistämiseksi, minulla on edelleen asioita, jotka ovat tikkuja lopussa. Ne eivät muuttuneet sammakoiksi, en kaiverrellut niitä.
Tuli olisi paitsi ei-binäärinen, myös sulkeutumaton – jos käytän tulta keppeihin, onko minulla lopussa keppejä? No ei, ei oikeastaan. Poltettuja tikkuja, toki — mikä huomattavastikin on tikkuja, joihin on tehty tulioperaatio.
#2 on assosiatiivisuus. Se tarkoittaa, että järjestyksellä, jossa arvioimme asioita, ei ole väliä.
#3 on identiteetti. Tämä on asia, joka on analoginen nollan kanssa – jos otat sen ja sovellat siihen operaatiota ja jotain, mikään ei muutu. Eli No Sticks olisi se tässä.
Ohjelmoinnin kannalta merkkijonojen ketjutus on hyvä ei-matemaattinen esimerkki.
Mikä on binäärioperaatio? Konkatenaatio. Asioiden yhdistäminen toisiinsa. (Muistakaa mitä sanoin siitä, että se tuntuu yhteenlaskulta!) Operoidaan vain kahdella kappaleella kerrallaan. Jos sinulla olisi miljoona sanaa, tekisit sen silti lisäämällä yhden toiseen jne. a + b => ab
Onko se suljettu tuon operaation alla? Sulkeutuminen tarkoittaa ”minulla on tämän tyyppistä tavaraa, teen sille jotain ja lopussa on vielä tuota tyyppiä”. Jos siis otamme merkkijonoja ja liimaamme ne yhteen, saamme… pitkän merkkijonon! Joten kyllä, se on merkkijono. Siistiä! Se on siis suljettu operaatiollamme.
Onko se assosiatiivinen? Jep! Ja muistakaa, tämä ei tarkoita, että järjestyksellä ei olisi väliä – vaan että evaluointijärjestyksellä ei ole väliä. he + llo
antaa saman tuloksen kuin h + ello
tai h + el + lo
tai h + (el + lo)
tai (h + el) + lo
tai ((h + (e + l) + l) + o
ovat kaikki hello
lopussa. (Huomaa, että ’järjestyksellä on väliä’ tässä olisi — onko he + llo
sama kuin lh + elo
? Ei, hello
ei ole lhelo
.
Onko tälle operaatiolle olemassa identiteetti? Jep — tyhjä merkkijono. apple + ""
on apple
. Silti merkkijono. ""
on myös merkkijono, vain sellainen, jossa ei ole mitään. Voimme siis käyttää sitä operaatioomme, ja saamme edelleen merkkijonon — itse asiassa saman merkkijonon, jolla aloitimme!