Monáda nebo monoid?
Technická definice zní: Monoid je pologrupa s identitou. Což není moc ELI5.
Takže: monoid je „hromada věcí a věc, kterou s těmi věcmi děláme a která se chová docela intuitivně“. Což je zatraceně vágní. Ale tak to má být. Velmi často se věci, které se takto chovají, „cítí“ jako sčítání.
Podobně jako třeba strkání hromady klacíků k sobě.
-
Pokud mám nějaké klacky a strčím je k sobě, co je na té hromadě? Klacky, že? Jo.
-
Co když je nejdřív strčím na menší hromádky a pak ty hromádky jakoby přeskupím kolem sebe a pak je strčím k sobě? Je to pořád hromada klacíků? Co když nejdřív strčím klacíky nalevo, než udělám zbytek? Ano. Je to v podstatě stejná hromada klacků? Ano.
-
Pokud mám hromadu klacíků a strčím na ni Bez klacíků… změnilo se něco? Ne.
První dva z toho dělají pologrupu.
#1 je uzávěr pod binární operací. Jistě, je tam spousta tyčinek, ale mohl bych to rozdělit na dvě skupiny, nebo přidat po jedné tyčince, nebo cokoli jiného. Když operuji s tyčinkami pomocí Shove, abych je spojil, stále mám na konci věci, které jsou tyčinkami. Neproměnily se v žáby, nevyřezával jsem je.
Oheň by byl nejen nebinární, ale také neuzavřený – když na klacíky použiji oheň, mám na konci klacíky? No, ne, tak úplně ne. Spálené klacíky určitě — což jsou nápadně klacíky, na kterých byla provedena operace ohně.
#2 je asociativita. To znamená, že na pořadí, v jakém věci vyhodnocujeme, nezáleží.
#3 je identita. To je věc, která je analogická nule – když ji vezmete a použijete na ni svou operaci a něco, nic se nezmění. Takže tady by to byl No Sticks.
Z hlediska programování je dobrým ne-matematickým příkladem spojování řetězců.
Co je to binární operace? Konkatenace. Spojování věcí dohromady. (Vzpomeňte si, co jsem říkal o pocitu sčítání!) Operujete vždy jen se dvěma částmi. Kdybyste měli milion slov, stejně byste to dělali tak, že byste jedno přidali k druhému atd. a + b => ab
Je to pod touto operací uzavřené? Uzavřenost znamená „mám věci tohoto druhu, něco s nimi udělám a na konci mám stále tento druh“. Takže když vezmeme řetězce a slepíme je k sobě, máme… dlouhý řetězec! Takže ano, je to řetězec. Super! Takže je pod naší operací uzavřený.
Je asociativní? Jo! A nezapomeňte, že to neznamená, že na pořadí nezáleží – ale že nezáleží na pořadí vyhodnocení. he + llo
dává stejný výsledek jako h + ello
nebo h + el + lo
nebo h + (el + lo)
nebo (h + el) + lo
nebo ((h + (e + l) + l) + o
jsou všechny hello
na konci. (Všimněte si, že ‚na pořadí záleží‘ by zde bylo — je he + llo
stejný jako lh + elo
? Ne, hello
není lhelo
.
Existuje pro tuto operaci nějaká identita? Ano — prázdný řetězec. apple + ""
je apple
. Stále je to řetězec. ""
je také řetězec, jen v něm nic není. Takže ho můžeme použít pro naši operaci a stále dostaneme řetězec — vlastně stejný řetězec, se kterým jsme začínali!