Monade ou monoïde ?
La définition technique est qu’un monoïde est un semigroupe avec une identité. Ce qui n’est pas très ELI5.
Alors : un monoïde est « un tas de trucs, et un truc qu’on fait avec ces trucs, qui se comporte de manière assez intuitive. » Ce qui est vague comme l’enfer. Mais c’est censé l’être. Très fréquemment, les choses qui se comportent comme ça « sentent » l’addition.
Comme, disons, en poussant un tas de bâtons ensemble.
-
Si j’ai des bâtons, et que je les pousse ensemble, qu’est-ce qu’il y a dans le tas ? Des bâtons, non ? Ouaip.
-
Et si je les entasse d’abord en plus petits tas et qu’ensuite je regroupe ces tas autour d’eux-mêmes et que je les entasse ensemble ? Est-ce que ça reste une pile de bâtons ? Et si je poussais d’abord les bâtons de gauche avant de faire le reste ? Oui. Est-ce que c’est fondamentalement la même pile de bâtons ? Ouaip.
-
Si j’ai un tas de bâtons et que je pousse No Sticks dessus… est-ce que quelque chose a changé ? Non.
Les deux premiers sont ce qui en fait un semigroupe.
#1 est la fermeture sous une opération binaire. Bien sûr, il y a beaucoup de bâtons, mais je pourrais les diviser en deux groupes, ou ajouter un bâton à la fois, ou autre chose. Lorsque j’opère sur les bâtons en utilisant Shove pour les rassembler, j’ai toujours des choses qui sont des bâtons à la fin. Ils ne se sont pas transformés en grenouilles, je ne les ai pas sculptés.
Le feu serait non seulement non binaire, mais aussi non fermé — si j’utilise le feu sur les bâtons, est-ce que j’ai des bâtons à la fin ? Eh bien, non, pas vraiment. Des bâtons brûlés, bien sûr — ce qui sensiblement, est des bâtons qui ont eu l’opération du feu sur eux.
#2 est l’associativité. Cela signifie que l’ordre dans lequel nous évaluons les choses n’a pas d’importance.
#3 est l’identité. C’est la chose qui est analogue au zéro — si vous le prenez, et appliquez votre opération sur lui et quelque chose, rien ne change. Donc No Sticks serait ici.
Du point de vue de la programmation, la concaténation de chaînes de caractères est un bon exemple non-mathématique.
Quelle est l’opération binaire ? Concaténation. Joindre les choses ensemble. (Rappelez-vous ce que j’ai dit sur le sentiment d’addition !) Vous n’opérez que sur deux morceaux à la fois. Si vous aviez un million de mots, vous le feriez quand même en ajoutant un à un autre, etc. a + b => ab
Est-il fermé sous cette opération ? La fermeture signifie « j’ai des trucs de ce type, je fais quelque chose dessus et j’ai toujours ce type à la fin ». Donc, si on prend des chaînes de caractères et qu’on les colle ensemble, on obtient… une longue chaîne de caractères ! Donc, ouais, c’est une chaîne. Cool ! Donc elle est fermée par notre opération.
Est-elle associative ? Ouaip ! Et rappelez-vous, cela ne signifie pas que l’ordre n’a pas d’importance – mais que l’ordre d’évaluation n’a pas d’importance. he + llo
donne le même résultat que h + ello
ou h + el + lo
ou h + (el + lo)
ou (h + el) + lo
ou ((h + (e + l) + l) + o
sont tous hello
à la fin. (Notez que » l’ordre importe » ici serait : he + llo
est-il le même que lh + elo
? Non, hello
n’est pas lhelo
.
Y a-t-il une identité pour cette opération ? Oui, la chaîne vide. apple + ""
est apple
. Toujours une chaîne. ""
est une chaîne de caractères, aussi, juste une sans rien dedans. Donc on peut l’utiliser pour notre opération, on obtient toujours une chaîne — la même chaîne qu’au départ, en fait!