//@NO-IMPLICIT-PRELUDE
//! Implementation of the `Group` type
let { Monoid } = import! std.monoid
/// `Group a` represents an monoid an which has an inverse element. This means
/// the following additional laws must hold:
///
/// * `forall x . append (inverse x) x = empty = append x (inverse x)`
#[implicit]
type Group a = {
monoid : Monoid a,
/// The inverse operation
inverse : a -> a
}
{
Group
}