It is well-known that monoids are stunningly ubiquitous in programing. They are so ubiquitous and so useful that I, as a 'hobby project', am working on a system that is completely based on their properties (distributed data aggregation). To make the system useful I need useful monoids :)
I already know of these:
- Numeric or matrix sum
- Numeric or matrix product
- Minimum or maximum under a total order with a top or bottom element (more generally, join or meet in a bounded lattice, or even more generally, product or coproduct in a category)
- Set union
- Map union where conflicting values are joined using a monoid
- Intersection of subsets of a finite set (or just set intersection if we speak about semigroups)
- Intersection of maps with a bounded key domain (same here)
- Merge of sorted sequences, perhaps with joining key-equal values in a different monoid/semigroup
- Bounded merge of sorted lists (same as above, but we take the top N of the result)
- Cartesian product of two monoids or semigroups
- List concatenation
- Endomorphism composition.
Now, let us define a quasi-property of an operation as a property that holds up to an equivalence relation. For example, list concatenation is quasi-commutative if we consider lists of equal length or with identical contents up to permutation to be equivalent.
Here are some quasi-monoids and quasi-commutative monoids and semigroups:
- Any (a+b = a or b, if we consider all elements of the carrier set to be equivalent)
- Any satisfying predicate (a+b = the one of a and b that is non-null and satisfies some predicate P, if none does then null; if we consider all elements satisfying P equivalent)
- Bounded mixture of random samples (xs+ys = a random sample of size N from the concatenation of xs and ys; if we consider any two samples with the same distribution as the whole dataset to be equivalent)
- Bounded mixture of weighted random samples
- Let's call it "topological merge": given two acyclic and non-contradicting dependency graphs, a graph that contains all the dependencies specified in both. For example, list "concatenation" that may produce any permutation in which elements of each list follow in order (say, 123+456=142356).
Which others do exist?