Monade of monoïde?
De technische definitie is een monoïde is een semigroep met een identiteit. Dat is niet erg ELI5.
Dus: een monoïde is “een verzameling dingen, en een ding dat we met die dingen doen, dat zich vrij intuïtief gedraagt.” Dat is zo vaag als de pest. Maar zo is het wel bedoeld. Heel vaak “voelen” dingen die zich zo gedragen als optellen.
Zoiets als, zeg maar, een hoopje stokjes tegen elkaar schuiven.
-
Als ik wat stokjes heb, en ik schuif ze tegen elkaar, wat zit er dan op die stapel? Stokken, toch? Jazeker.
-
Wat als ik ze eerst in kleinere stapeltjes schuif en die stapeltjes vervolgens om elkaar heen groepeer en ze dan bij elkaar schuif? Is het dan nog steeds een stapel stokjes? Wat als ik eerst de stokjes links schuif en dan de rest? Yup. Is het in principe dezelfde stapel stokjes? Ja.
-
Als ik een stapel stokjes heb en er Geen Stokjes tegenaan duw… is er dan iets veranderd? Nee.
De eerste twee maken het een semigroep.
#1 is sluiting onder een binaire operatie. Zeker, er zijn veel stokjes, maar ik kan ze in twee groepen splitsen, of één stokje per keer toevoegen, of wat dan ook. Als ik de stokjes bewerk met Shove om ze samen te brengen, heb ik aan het eind nog steeds dingen die stokjes zijn. Ze zijn niet veranderd in kikkers, Ik heb ze niet uitgesneden.
Vuur zou niet alleen niet-binaire zijn, maar ook niet gesloten — als ik vuur gebruik op de stokjes, heb ik dan stokjes aan het eind? Nou, nee, niet echt. Verbrande stokjes, zeker — wat merkbaar is, dat zijn stokjes waar de vuurbewerking op is uitgevoerd.
#2 is associativiteit. Dat betekent dat de volgorde waarin we dingen evalueren er niet toe doet.
#3 is de identiteit. Dit is het ding dat analoog is aan nul — als je het neemt, en je past er je bewerking op toe en iets, verandert er niets. Dus No Sticks zou het hier zijn.
Vanuit een programmeer perspectief, strings aaneenschakelen is een goed niet-wiskunde voorbeeld.
Wat is de binaire operatie? Aaneenschakeling. Dingen samenvoegen. (Weet je nog wat ik zei over het gevoel van optellen!) Je werkt met slechts twee stukken tegelijk. Als je een miljoen woorden had, zou je het nog steeds doen door het ene bij het andere op te tellen, enzovoort. a + b => ab
Is het onder die bewerking gesloten? Sluiting betekent “Ik heb dingen van dit type, doe er iets mee en heb aan het eind nog steeds dat type”. Dus, als we strings nemen en ze aan elkaar plakken, hebben we… een lange string! Dus, yup, het is een string. Cool! Dus het is gesloten onder onze operatie.
Is het associatief? Yup! En onthoud, dit betekent niet dat de volgorde er niet toe doet – maar dat de volgorde van evaluatie er niet toe doet. he + llo
geeft hetzelfde resultaat als h + ello
of h + el + lo
of h + (el + lo)
of (h + el) + lo
of ((h + (e + l) + l) + o
allemaal hello
aan het eind zijn. (Merk op dat “volgorde doet er wel toe” hier zou zijn — is he + llo
hetzelfde als lh + elo
? Nope, hello
is niet lhelo
.
Is er een identiteit voor deze bewerking? Yup — de lege string. apple + ""
is apple
. Nog steeds een string. ""
is ook een string, maar dan zonder iets erin. Dus we kunnen het gebruiken voor onze operatie, en nog steeds een string krijgen — dezelfde string waar we mee begonnen, in feite!