jkff
jkff

Reputation: 17913

Examples of monoids/semigroups in programming

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:

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:

Which others do exist?

Upvotes: 29

Views: 3872

Answers (4)

Daira-Emma Hopwood
Daira-Emma Hopwood

Reputation: 2360

A really useful example of a commutative monoid is unification in logic and constraint languages. See section 2.8.2.2 of Concepts, Techniques and Models of Computer Programming for a precise definition of a possible unification algorithm.

Good luck with your language! I'm doing something similar with a parallel language, using monoids to merge subresults from parallel computations.

Upvotes: 2

Chad Brewbaker
Chad Brewbaker

Reputation: 2579

Arbitrary length Roman numeral value computation. https://gist.github.com/4542999

Upvotes: 1

sdcvvc
sdcvvc

Reputation: 25654

Quotient monoid is another way to form monoids (quasimonoids?): given monoid M and an equivalence relation ~ compatible with multiplication, it gives another monoid. For example:

  • finite multisets with union: if A* is a free monoid (lists with concatenation), ~ is "is a permutation of" relation, then A*/~ is a free commutative monoid.

  • finite sets with union: If ~ is modified to disregard count of elements (so "aa" ~ "a") then A*/~ is a free commutative idempotent monoid.

  • syntactic monoid: Any regular language gives rise to syntactic monoid that is quotient of A* by "indistinguishability by language" relation. Here is a finger tree implementation of this idea. For example, the language {a3n:n natural} has Z3 as the syntactic monoid.

Quotient monoids automatically come with homomorphism M -> M/~ that is surjective.

A "dual" construction are submonoids. They come with homomorphism A -> M that is injective.

Yet another construction on monoids is tensor product.

Monoids allow exponentation by squaring in O(log n) and fast parallel prefix sums computation. Also they are used in Writer monad.

Upvotes: 8

Steve
Steve

Reputation: 1631

The Haskell standard library is alternately praised and attacked for its use of the actual mathematical terms for its type classes. (In my opinion it's a good thing, since without it I'd never even know what a monoid is!). In any case, you might check out http://www.haskell.org/ghc/docs/latest/html/libraries/base/Data-Monoid.html for a few more examples:

  • the dual of any monoid is a monoid: given a+b, define a new operation ++ with a++b = b+a
  • conjunction and disjunction of booleans
  • over the Maybe monad (aka "option" in Ocaml), first and last. That is,
    first (Just a) b = Just a
    first Nothing b = b
    and likewise for last

The latter is just the tip of the iceberg of a whole family of monoids related to monads and arrows, but I can't really wrap my head around these (other than simply monadic endomorphisms). But a google search on monads monoids turns up quite a bit.

Upvotes: 6

Related Questions