HoleyMonoid-0.1.2: 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 HoleyMonoids.

Constructors

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

Instances

 Monoid m => Category * (HoleyMonoid m) Source # Methodsid :: cat a a #(.) :: cat b c -> cat a b -> cat a c # Monad (HoleyMonoid m r) Source # Methods(>>=) :: HoleyMonoid m r a -> (a -> HoleyMonoid m r b) -> HoleyMonoid m r b #(>>) :: HoleyMonoid m r a -> HoleyMonoid m r b -> HoleyMonoid m r b #return :: a -> HoleyMonoid m r a #fail :: String -> HoleyMonoid m r a # Functor (HoleyMonoid m r) Source # Methodsfmap :: (a -> b) -> HoleyMonoid m r a -> HoleyMonoid m r b #(<\$) :: a -> HoleyMonoid m r b -> HoleyMonoid m r a # Source # Methodspure :: a -> HoleyMonoid m r a #(<*>) :: HoleyMonoid m r (a -> b) -> HoleyMonoid m r a -> HoleyMonoid m r b #(*>) :: HoleyMonoid m r a -> HoleyMonoid m r b -> HoleyMonoid m r b #(<*) :: HoleyMonoid m r a -> HoleyMonoid m r b -> HoleyMonoid m r a #

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 laters 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.