# semirings-0.4.2: two monoids as one, in holy haskimony

Haskellers are usually familiar with monoids and semigroups. A monoid has an appending operation `<>`

(or `mappend`

),
and an identity element, `mempty`

. A semigroup has an appending `<>`

operation, but does not require a `mempty`

element.

A Semiring has two appending operations, `plus`

and `times`

, and two respective identity elements, `zero`

and `one`

.

More formally, a Semiring R is a set equipped with two binary relations `+`

and `*`

, such that:

(R,+) is a commutative monoid with identity element 0,

(R,*) is a monoid with identity element 1,

(*) left and right distributes over addition, and

multiplication by '0' annihilates R.