| Copyright | Copyright (c) 2012, Thomas Wilke, Frank Huch, Sebastian Fischer. Copyright (c) 2014-2016, Peter Harpending. |
|---|---|
| License | BSD3 |
| Maintainer | Peter Harpending <peter@harpending.org> |
| Stability | experimental |
| Portability | portable |
| Safe Haskell | Safe |
| Language | Haskell2010 |
Data.Semiring
Description
This library provides a type class for semirings.
A semiring is an additive commutative monoid with identity zero:
Most Haskellers are familiar with the Monoid typeclass:
zero <+> a ≡ a (a <+> b) <+> c ≡ a <+> (b <+> c)
In this case, we've aliased
zero = mempty (<+>) = mappend
A commutative monoid adds the requirement of symmetry:
a <+> b ≡ b <+> a
A semiring adds the requirement of a multiplication-like operator. However, it does not require the existence of multiplicative inverses, i.e. division. Moreover, multiplication does not need to be commutative.
one <.> a ≡ a
a <.> one ≡ a
(a <.> b) <.> c ≡ a <.> (b <.> c)Multiplication distributes over addition:
a <.> (b <+> c) ≡ (a <.> b) <+> (a <.> b) (a <+> b) <>. c ≡ (a <.> c) <+> (b <.> c)
zero annihilates a semiring with respect to multiplication:
zero <.> a ≡ zero a <.> zero ≡ zero
The classic example of a semiring is the "Tropical numbers". The Tropical numbers, or T, are just real numbers with different operators.
zero = ∞
a <+> b = minimum {a, b}
one = 0
a <.> b = a + bWe can easily verify that these satisfy the semiring axioms:
First, the requirements for a commutative monoid
minimum {∞, a} ≡ minimum {a, ∞} ≡ a
minimum {a, ∞} ≡ a
minimum {a, b} ≡ minimum {b, a}
minimum {a, minimum{b, c}} ≡ minimum {minimum {a, b}, c} 0 + a ≡ a
a + 0 ≡ a
a + (b + c) ≡ (a + b) + c
a + minimum {b, c} ≡ minimum {a + b, a + c}
minimum {a, b} + c ≡ minimum {a + c, b + c}
a + ∞ ≡ ∞
∞ + a ≡ ∞