Here are the many interesting Monoids
String concatenation
The identity: empty string
The operation: concatenation
("dog" ++ "cat") ++ "pig" = "dog" ++ ("cat" ++ "pig")
"" ++ "dog" = "dog" ++ "" = "dog"
Addition, subtraction, multiplication on Integer
The identity: 0
1 + 2 + 3 = 1 + (2 + 3)
0 + 1 = 1 + 0 = 1
Maximum(, ) and Minimum(, )
The identity: Mininum, Maximum
The operation: Maximum( , ), Minimum( , )
Max(Max(a, b), c) = Max(a, Max(b, c))
Max(Min, a) = a

Min(Min(a, b), c) = Min(a, Min(b, c))
Min(Max, a) = a
Boolean operations: Or and And
Identity: True
Operation: Or

Identity: False
Operation: And
True || False = False || True = False
False && True = True && False = False

Length Operation is monoid
Identity: [], empty list
Operation: length
length [] + length  = length  + length []
length [1, 2] + length [3, 4] + length  = length [1, 2] + (length [3, 4] + length )
Merge sorted list is monoid
Identity: []
Operation: merge
(+++:)::(Ord a)=>[a]->[a]->[a]
(+++:) xs [] = xs
(+++:) [] ys = ys
(+++:) (x:xs) (y:ys) = if x <= y then x:(xs +++: (y:ys)) else y:((x:xs) +++: ys)

main = do
pp $[] +++:  ==  -- left identity pp$  +++: [] ==   -- right identity
pp $ +++:  == [1, 2] -- a, b \in S, then a op b \in S pp$ [1, 2] +++: [0, 1, 9, 10] == [0, 1, 1, 2, 9, 10]
-- associativity
pp \$ ([1, 2] +++: [0, 1] +++: [4, 5]) == ([1, 2] +++: ([0, 1] +++: [4, 5]))