monoid-extras-0.7: Various extra monoid-related definitions and utilities

Safe Haskell | Safe-Inferred
Language | Haskell2010

Data.Monoid.SemiDirectProduct.Strict

Description

A strict version of the semi-direct product. If a monoid m acts on s then this version of the semi-direct product is strict in the m-portion of the semi-direct product.

Synopsis

- data Semi s m
- unSemi :: Semi s m -> (s, m)
- tag :: s -> m -> Semi s m
- inject :: Monoid m => s -> Semi s m
- untag :: Semi s m -> s
- embed :: Monoid s => m -> Semi s m
- quotient :: Semi s m -> m

# Documentation

data Semi s m Source #

The semi-direct product of monoids `s` and `m`, which is a monoid when `m` acts on `s`. Structurally, the semi-direct product is just a pair `(s,m)`. However, the monoid instance is different. In particular, we have

    (s1,m1) <> (s2,m2) = (s1 <> (m1 `act` s2), m1 <> m2)

We call the monoid `m` the quotient monoid and the monoid `s` the sub-monoid of the semi-direct product. The semi-direct product `Semi s m` is an extension of the monoid `s` with `m` being the quotient.

#### Instances

Instances details

(Monoid m, Monoid s, Action m s) => Monoid (Semi s m) Source # |
Instance details Defined in Data.Monoid.SemiDirectProduct.Strict Methods mempty :: Semi s m Source # mappend :: Semi s m -> Semi s m -> Semi s m Source # mconcat :: [Semi s m] -> Semi s m Source #
(Semigroup m, Semigroup s, Action m s) => Semigroup (Semi s m) Source # |
Instance details Defined in Data.Monoid.SemiDirectProduct.Strict Methods (<>) :: Semi s m -> Semi s m -> Semi s m Source # sconcat :: NonEmpty (Semi s m) -> Semi s m Source # stimes :: Integral b => b -> Semi s m -> Semi s m Source #

unSemi :: Semi s m -> (s, m) Source #

tag :: s -> m -> Semi s m Source #

Tag an `s` value with an `m` value to create an element of the semi-direct product.

inject :: Monoid m => s -> Semi s m Source #

The injection map, i.e. give an `s` value a trivial tag.

untag :: Semi s m -> s Source #

Forget the monoidal tag. Of course, `untag . inject = id`, and `untag (tag s m) = s`.

embed :: Monoid s => m -> Semi s m Source #

Embed a "tag" value as a value of type `Semi s m`. Note that

    inject s <> embed m = tag s m

and

`embed m <> inject s` = tag (act m s) m@

The semi-direct product gives a split extension of `s` by `m`. This allows us to embed `m` into the semi-direct product. This is the embedding map. The quotient and embed maps should satisfy the equation `quotient . embed = id`.

quotient :: Semi s m -> m Source #

The quotient map, i.e. retrieve the monoidal tag value.