This blogpost covers a brief background on the formal definition and theory behind Monoids. It by no means comprehensive or math intensive, but is more so a brief introduction to monoids. A monoid is a mathematical term, but is a practical pattern in functional programming.
It is a system that satisfies these three rules:
Closure - Given a function with parameters, the type of the parameters and the type of the return value are the same
An example is the +
function
(+ 1 2)
; => 3
It takes integers and returns another integer
Another examples is the or
function
(or true false)
; => true
It takes in booleans and returns a boolean
The fact that a function’s parameters and the function’s return value is of the type same is known as closure
Associativity - Given that your function abides by the closure property, the order of function operation does not matter, the same value will be returned
Back to the +
example
(+ (+ 1 2) 3)
; => 6
Is the same as
(+ 1 (+ 2 3))
; => 6
And with the or
function
(or (or true false) false)
; => true
Is the same as
(or true (or false false))
; => true
Identity - Given that your function abides by the closure property, there exists some value such that when you combine it with any other value you get back the original value as if nothing happened
+
example:
(+ 0 5)
; => 5
(+ 0 7)
; => 7
Here our identity value is 0
or
example:
(or true false)
; => true
(or false false)
; => false
Here our identity value is false because given another value combined with false we get back the original value.
To summarize, a monoid must abide by these 3 rules. And to clarify, a collection of things (or a set) AND the function make up a monoid. By definition a monoid can’t be one or the other. Here are a couple of examples of monoids: integers under addtion or strings under concatenation.