Monad eller monoid?
Den tekniska definitionen är att en monoid är en semigrupp med en identitet. Vilket inte är särskilt ELI5.
Så: en monoid är ”en massa saker, och en sak vi gör med dessa saker, som beter sig ganska intuitivt”. Vilket är vagt som fan. Men det är meningen att det ska vara det. Mycket ofta ”känns” saker som beter sig så här som addition.
Som till exempel att trycka ihop ett antal högar med pinnar.
-
Om jag har några pinnar och jag trycker ihop dem, vad finns då i högen? Pinnar, eller hur? Japp.
-
Vad händer om jag först lägger dem i mindre högar och sedan på något sätt omgrupperar dessa högar kring sig själva och sedan lägger dem ihop? Är det fortfarande en hög med pinnar? Vad händer om jag skjuter pinnarna till vänster först innan jag gör resten? Japp. Är det i princip samma hög med pinnar? Japp.
-
Om jag har en hög med pinnar och knuffar No Sticks mot den… har något förändrats? Nej.
De två första är det som gör det till en halvgrupp.
#1 är sluten under en binär operation. Visst finns det många pinnar, men jag kan dela upp den i två grupper, eller lägga till en pinne i taget, eller vad som helst. När jag opererar på pinnarna genom att använda Shove för att sammanföra dem, har jag fortfarande saker som är pinnar i slutändan. De har inte förvandlats till grodor, jag har inte snittat dem.
Fyr skulle inte bara vara icke-binär, utan också inte sluten – om jag använder eld på pinnarna, har jag då pinnar i slutet? Nej, inte riktigt. Brända pinnar, visst – som märkbart nog är pinnar som har eldats.
#2 är associativitet. Det betyder att det inte spelar någon roll i vilken ordning vi utvärderar saker och ting.
#3 är identiteten. Detta är det som är analogt med noll – om du tar det och tillämpar din operation på det och något, förändras ingenting. Så No Sticks skulle vara det här.
Från ett programmeringsperspektiv är strings concatenation ett bra icke-matematiskt exempel.
Vad är den binära operationen? Samkörning. Att sammanfoga saker och ting. (Kom ihåg vad jag sa om att det känns som addition!) Du opererar bara med två delar åt gången. Om du hade en miljon ord skulle du fortfarande göra det genom att addera ett till ett annat osv. a + b => ab
Är det stängt under den operationen? Stängning betyder ”Jag har saker av det här slaget, gör något med dem och har fortfarande kvar det här slaget i slutet”. Så om vi tar strängar och klistrar ihop dem har vi… en lång sträng! Så, ja, det är en sträng. Coolt! Så det är stängt under vår operation.
Är det associativt? Japp! Och kom ihåg att detta inte betyder att ordningen inte spelar någon roll – utan att utvärderingsordningen inte spelar någon roll. he + llo
ger samma resultat som h + ello
eller h + el + lo
eller h + (el + lo)
eller (h + el) + lo
eller ((h + (e + l) + l) + o
är alla hello
i slutet. (Observera att ”ordning spelar roll” här skulle vara — är he + llo
samma sak som lh + elo
? Nej, hello
är inte lhelo
.
Finns det en identitet för denna operation? Japp — den tomma strängen. apple + ""
är apple
. Fortfarande en sträng. ""
är också en sträng, bara en sträng utan något i den. Så vi kan använda den för vår operation och fortfarande få en sträng — samma sträng som vi började med!