//@NO-IMPLICIT-PRELUDE //! Implementation of the `Monoid` type let { Semigroup } = import! std.semigroup /// `Monoid a` represents an semigroup an which has an identity. This means /// the following additional laws must hold: /// /// * `forall x . append x empty == x` /// * `forall x . append empty x == x` #[implicit] type Monoid a = { semigroup : Semigroup a, /// # Note /// /// * Known as `mempty` in Haskell empty : a } let empty ?m : [Monoid a] -> a = m.empty { Monoid, empty, }