Algebra Overview

Algebra uses type classes to represent algebraic structures. You can use these type classes to represent the abstract capabilities (and requirements) you want generic parameters to possess.

This section will explain the structures available.

algebraic properties and terminology

We will be talking about properties like associativity and commutativity. Here is a quick explanation of what those properties mean:

Name Description
Associative If `⊕` is associative, then `a ⊕ (b ⊕ c)` = `(a ⊕ b) ⊕ c`.
Commutative If `⊕` is commutative, then `a ⊕ b` = `b ⊕ a`.
Identity If `id` is an identity for `⊕`, then `a ⊕ id` = `id ⊕ a` = `a`.
Inverse If `¬` is an inverse for `⊕` and `id`, then `a ⊕ ¬a` = `¬a ⊕ a` = `id`.
Distributive If `⊕` and `⊙` distribute, then `a ⊙ (b ⊕ c)` = `(a ⊙ b) ⊕ (a ⊙ c)` and `(a ⊕ b) ⊙ c` = `(a ⊙ c) ⊕ (b ⊙ c)`.
Idempotent If `⊕` is idempotent, then `a ⊕ a` = `a`. If `f` is idempotent, then `f(f(a))` = `f(a)`

Though these properties are illustrated with symbolic operators, they work equally-well with functions. When you see `a ⊕ b` that is equivalent to `f(a, b)`: `⊕` is an infix representation of the binary function `f`, and `a` and `b` are values (of some type `A`).

Similarly, when you see `¬a` that is equivalent to `g(a)`: `¬` is a prefix representation of the unary function `g`, and `a` is a value (of some type `A`).

basic algebraic structures

The most basic structures can be found in the `algebra` package. They all implement a method called `combine`, which is associative. The identity element (if present) will be called `empty`, and the inverse method (if present) will be called `inverse`.

Name Associative? Commutative? Identity? Inverse? Idempotent?
Semigroup
CommutativeSemigroup
Monoid
Band
Semilattice
Group
CommutativeMonoid
CommutativeGroup
BoundedSemilattice

(For a description of what each column means, see §algebraic properties and terminology.)

ring-like structures

The `algebra.ring` package contains more sophisticated structures which combine an additive operation (called `plus`) and a multiplicative operation (called `times`). Additive identity and inverses will be called `zero` and `negate` (respectively); multiplicative identity and inverses will be called `one` and `reciprocal` (respectively).

All ring-like structures are associative for both `+` and `*`, have commutative `+`, and have a `zero` element (an identity for `+`).

Name Has `negate`? Has `1`? Has `reciprocal`? Commutative `*`?
Semiring
Rng
Rig
CommutativeRig
Ring
CommutativeRing
Semifield
CommutativeSemifield
Field

(For a description of what the terminology in each column means, see §algebraic properties and terminology.)

lattice-like structures

The `algebra.lattice` package contains more structures that can be somewhat ring-like. Rather than `plus` and `times` we have `meet` and `join` both of which are always associative, commutative and idempotent, and as such each can be viewed as a semilattice. Meet can be thought of as the greatest lower bound of two items while join can be thought of as the least upper bound between two items.

When `zero` is present, `join(a, zero)` = `a`. When `one` is present `meet(a, one)` = `a`.

When `meet` and `join` are both present, they obey the absorption law:

• `meet(a, join(a, b))` = `join(a, meet(a, b)) = a`

Sometimes meet and join distribute, we say it is distributive in this case:

• `meet(a, join(b, c))` = `join(meet(a, b), meet(a, c))`
• `join(a, meet(b, c))` = `meet(join(a, b), join(a, c))`

Sometimes an additional binary operation `imp` (for impliciation, also written as →, meet written as ∧) is present. Implication obeys the following laws:

• `a → a` = `1`
• `a ∧ (a → b)` = `a ∧ b`
• `b ∧ (a → b)` = `b`
• `a → (b ∧ c)` = `(a → b) ∧ (a → c)`

The law of the excluded middle can be expressed as:

• `(a ∨ (a → 0))` = `1`
Name Has `join`? Has `meet`? Has `zero`? Has `one`? Distributive Has `imp`? Excludes middle?
JoinSemilattice
MeetSemilattice
BoundedJoinSemilattice
BoundedMeetSemilattice
Lattice
DistributiveLattice
BoundedLattice
BoundedDistributiveLattice
Heyting
Bool

Note that a `BoundedDistributiveLattice` gives you a `CommutativeRig`, but not the other way around: rigs aren't distributive with `a + (b * c) = (a + b) * (a + c)`.

Also, a `Bool` gives rise to a `BoolRing`, since each element can be defined as its own negation. Note, Bool's `.asBoolRing` is not an extension of the `.asCommutativeRig` method as the `plus` operations are defined differently.