id -package:universum -package:faktory package:base is:module

The identity functor and monad. This trivial type constructor serves two purposes:
  • It can be used with functions parameterized by functor or monad classes.
  • It can be used as a base monad to which a series of monad transformers may be applied to construct a composite monad. Most monad transformer modules include the special case of applying the transformer to Identity. For example, State s is an abbreviation for StateT s Identity.
A type a is a Monoid if it provides an associative function (<>) that lets you combine any two values of type a into one, and a neutral element (mempty) such that
a <> mempty == mempty <> a == a
A Monoid is a Semigroup with the added requirement of a neutral element. Thus any Monoid is a Semigroup, but not the other way around.

Examples

The Sum monoid is defined by the numerical addition operator and `0` as neutral element:
>>> mempty :: Sum Int
Sum {getSum = 0}

>>> Sum 1 <> Sum 2 <> Sum 3 <> Sum 4 :: Sum Int
Sum {getSum = 10}
We can combine multiple values in a list into a single value using the mconcat function. Note that we have to specify the type here since Int is a monoid under several different operations:
>>> mconcat [1,2,3,4] :: Sum Int
Sum {getSum = 10}

>>> mconcat [] :: Sum Int
Sum {getSum = 0}
Another valid monoid instance of Int is Product It is defined by multiplication and `1` as neutral element:
>>> Product 1 <> Product 2 <> Product 3 <> Product 4 :: Product Int
Product {getProduct = 24}

>>> mconcat [1,2,3,4] :: Product Int
Product {getProduct = 24}

>>> mconcat [] :: Product Int
Product {getProduct = 1}
A logically uninhabited data type, used to indicate that a given term should not exist.