= Monoid = Types with an ''associative'' (meaning ordering does not matter) binary (meaning of two values) operation (a combinator) that has an ''identity'', which sometimes also called 'the unit'. (applying it changes nothing). Identity for ''Addition'' is {{{0}}}, for ''Multiplication'' it is {{{1}}}. For concatenation of ''Lists'' it is {{{[]}}}, for ''String'' concatenation it is {{{""}}}, etc. Basically, ''identity'' is the notion of ''emptiness'' or ''nothingness'' in a given particular ''context''. (Multiplication is a bit tricky - {{{1}}} is ''at least how many times''). Usually ''units'' are ''the base-cases'' of recursion (of a recursive process). == Monoid laws == Identity {{{#!haskell x <> mempty = x mempty <> x = x }}} Semigroup {{{#!haskell x <> (y <> z) = (x <> y) <> z }}} == Connection to Reality == There is no Monoids outside one's head. Wait! There is one... The image you see in a mirror is an ''identity''. ''An arrow to yourself''. {{{#!haskell you <> mirror = you mirror <> you = you }}} But there is a problem with an associative binary operation... The one we all know is, strictly speaking, not associative. == Haskell == ''To be'' a Monoid is to implement {{{mappend}}} and {{{mempty}}} which conform to ''Monoid laws''. {{{#!haskell class Semigroup a => Monoid a where mempty :: a mappend :: a -> a -> a mappend = (<>) }}} ----- See also [wiki:/FunctionalProgramming/Semigroup Semigroup]