Monade oder Monoid?
Die technische Definition lautet: Ein Monoid ist eine Halbgruppe mit einer Identität. Das ist nicht sehr ELI5.
So: ein Monoid ist „ein Haufen Zeug und eine Sache, die wir mit diesem Zeug machen, die sich ziemlich intuitiv verhält.“ Was verdammt vage ist. Aber das soll es auch. Sehr häufig „fühlen“ sich Dinge, die sich so verhalten, wie eine Addition an.
Wie, sagen wir, ein Haufen Stöckchen zusammenzuschieben.
-
Wenn ich ein paar Stöcke habe und sie zusammenschiebe, was ist dann in dem Stapel? Stöcke, richtig? Jepp.
-
Was ist, wenn ich sie zuerst in kleinere Stapel schiebe und diese Stapel dann irgendwie um sich selbst herum gruppiere und dann zusammenschiebe? Ist das immer noch ein Stapel von Stöcken? Was ist, wenn ich zuerst die Stöcke auf der linken Seite schiebe, bevor ich den Rest mache? Ja, genau. Ist es im Grunde derselbe Stapel von Stöcken? Ja.
-
Wenn ich einen Haufen Stöcke habe und keine Stöcke darauf schiebe… hat sich etwas geändert? Nein.
Die ersten beiden sind es, die es zu einer Halbgruppe machen.
#1 ist die Schließung durch eine binäre Operation. Sicher, es gibt viele Stäbchen, aber ich könnte sie in zwei Gruppen aufteilen oder ein Stäbchen nach dem anderen hinzufügen oder was auch immer. Wenn ich die Stäbchen mit Shove zusammenführe, habe ich am Ende immer noch Dinge, die Stäbchen sind. Sie haben sich nicht in Frösche verwandelt, ich habe sie nicht geschnitzt.
Feuer wäre nicht nur nicht-binär, sondern auch nicht geschlossen – wenn ich Feuer auf die Stöcke anwende, habe ich dann am Ende Stöcke? Nun, nein, nicht wirklich. Verbrannte Stöcke, sicher – das sind nämlich Stöcke, die mit Feuer bearbeitet wurden.
#2 ist Assoziativität. Das bedeutet, dass die Reihenfolge, in der wir die Dinge bewerten, keine Rolle spielt.
#3 ist die Identität. Das ist das Ding, das analog zu Null ist – wenn du es nimmst und deine Operation darauf anwendest und etwas, ändert sich nichts. Also wäre No Sticks hier das Richtige.
Aus der Perspektive der Programmierung ist die Verkettung von Zeichenketten ein gutes Beispiel für Nicht-Mathematik.
Was ist die binäre Operation? Verkettung. Das Zusammenfügen von Dingen. (Erinnern Sie sich daran, was ich über das Gefühl der Addition gesagt habe!) Sie arbeiten immer nur mit zwei Teilen auf einmal. Wenn du eine Million Wörter hättest, würdest du immer noch eins zum anderen addieren usw. a + b => ab
Ist es bei dieser Operation geschlossen? Geschlossenheit bedeutet: „Ich habe etwas von dieser Art, mache etwas damit und habe am Ende immer noch diese Art.“ Wenn wir also Zeichenketten nehmen und sie zusammenkleben, haben wir … eine lange Zeichenkette! Also, ja, es ist ein String. Cool! Also ist sie unter unserer Operation geschlossen.
Ist sie assoziativ? Ja, genau! Und denk daran, das bedeutet nicht, dass die Reihenfolge keine Rolle spielt, sondern dass die Reihenfolge der Auswertung keine Rolle spielt. he + llo
ergibt das gleiche Ergebnis wie h + ello
oder h + el + lo
oder h + (el + lo)
oder (h + el) + lo
oder ((h + (e + l) + l) + o
sind alle hello
am Ende. (Anmerkung: „Die Reihenfolge spielt eine Rolle“ wäre hier – ist he + llo
das gleiche wie lh + elo
? Nein, hello
ist nicht lhelo
.
Gibt es eine Identität für diese Operation? Ja, die leere Zeichenfolge. apple + ""
ist apple
. Immer noch eine Zeichenkette. ""
ist auch eine Zeichenkette, nur eine ohne irgendetwas darin. Wir können sie also für unsere Operation verwenden und erhalten immer noch eine Zeichenkette – dieselbe Zeichenkette, mit der wir angefangen haben!