HoleyMonoid-0.1.1: Monoids with holes.

Data.HoleyMonoid

Description

Monoids with holes. The `HoleyMonoid` allows building monoidal values of which certain components are to be filled in later. For example:

```> let holey :: (Show a, Show b) => HoleyMonoid String r (a -> b -> r)
holey = now "x = " . later show . now ", y = " . later show

> run holey 3 5
"x = 3, y = 5"```

This module is intended to be imported in qualified fashion, e.g.

`import qualified Data.HoleyMonoid as HM`

Synopsis

# Documentation

newtype HoleyMonoid m r a Source

The type of a monoid with holes. The underlying monoid is represented by type parameter `m`. The `r` is the result type and stays polymorphic until the very last moment when `run` is called. The last argument `a` is always a function with zero or more arguments, finally resulting in `r`. Ordering the arguments in this order allows holey monoids to be composed using `.`, stacking the expected arguments. Note that the `Monoid` constraint is only used in the identity `HoleyMonoid` and in composing two `HoleyMonoid`s.

Constructors

 HoleyMonoid FieldsrunHM :: (m -> r) -> a

Instances

 Monoid m => Category * (HoleyMonoid m) Monad (HoleyMonoid m r) Functor (HoleyMonoid m r) Applicative (HoleyMonoid m r)

run :: HoleyMonoid m m a -> a Source

Run the computation, resulting in a function that still expects some arguments. The number of arguments that is still expected will be equal to the number of `later`s the computation is built of.

now :: m -> HoleyMonoid m r r Source

Insert a constant monoidal value.

later :: (a -> m) -> HoleyMonoid m r (a -> r) Source

Insert a monoidal value that is not specified until the computation is `run`. The argument that is expected later is converted to the monoid type using the given conversion function.

bind :: HoleyMonoid m b c -> (m -> HoleyMonoid n a b) -> HoleyMonoid n a c Source

Monadic indexed bind on the underlying `Monoid` types.

map :: (m -> n) -> HoleyMonoid m r a -> HoleyMonoid n r a Source

Map between underlying `Monoid` types.