Stability | experimental |
---|---|

Maintainer | ekmett@gmail.com |

Safe Haskell | Safe-Infered |

Representable endofunctors over the category of Haskell types are isomorphic to the reader monad and so inherit a very large number of properties for free.

- class (Functor f, Indexable f) => Representable f where
- newtype Rep f a = Rep {
- unrep :: f a

- repLens :: Representable f => Lens a b -> Lens (f a) (f b)
- fmapRep :: Representable f => (a -> b) -> f a -> f b
- distributeRep :: (Representable f, Functor w) => w (f a) -> f (w a)
- mapWithKeyRep :: Representable f => (Key f -> a -> b) -> f a -> f b
- apRep :: Representable f => f (a -> b) -> f a -> f b
- pureRep :: Representable f => a -> f a
- liftR2 :: Representable f => (a -> b -> c) -> f a -> f b -> f c
- liftR3 :: Representable f => (a -> b -> c -> d) -> f a -> f b -> f c -> f d
- bindRep :: Representable f => f a -> (a -> f b) -> f b
- bindWithKeyRep :: Representable f => f a -> (Key f -> a -> f b) -> f b
- zipWithRep :: Representable f => (a -> b -> c) -> f a -> f b -> f c
- zipWithKeyRep :: Representable f => (Key f -> a -> b -> c) -> f a -> f b -> f c
- askRep :: Representable f => f (Key f)
- localRep :: Representable f => (Key f -> Key f) -> f a -> f a
- duplicateRep :: (Representable f, Semigroup (Key f)) => f a -> f (f a)
- extendRep :: (Representable f, Semigroup (Key f)) => (f a -> b) -> f a -> f b
- extractRep :: (Indexable f, Monoid (Key f)) => f a -> a

# Representable Functors

class (Functor f, Indexable f) => Representable f whereSource

A `Functor`

`f`

is `Representable`

if `tabulate`

and `index`

witness an isomorphism to `(->) x`

.

tabulate . index = id index . tabulate = id tabulate . return f = return f

Representable Identity | |

Representable ((->) e) | |

Representable m => Representable (IdentityT m) | |

Representable f => Representable (Cofree f) | |

Representable f => Representable (Rep f) | |

Representable w => Representable (TracedT s w) | |

Representable m => Representable (ReaderT e m) | |

(Representable f, Representable g) => Representable (Compose f g) | |

(Representable f, Representable g) => Representable (Product f g) | |

(Representable f, Representable m) => Representable (ReaderT f m) |

# Wrapped representable functors

ComonadTrans Rep | |

(Representable f, ~ * (Key f) a) => MonadReader a (Rep f) | |

Representable f => Monad (Rep f) | |

Representable f => Functor (Rep f) | |

Representable f => Applicative (Rep f) | |

(Representable f, Semigroup (Key f), Monoid (Key f)) => Comonad (Rep f) | |

(Representable f, Semigroup (Key f)) => Extend (Rep f) | |

Representable f => Distributive (Rep f) | |

Representable f => Keyed (Rep f) | |

Representable f => Zip (Rep f) | |

Representable f => ZipWithKey (Rep f) | |

Indexable f => Indexable (Rep f) | |

Indexable f => Lookup (Rep f) | |

Representable f => Apply (Rep f) | |

Representable f => Bind (Rep f) | |

Representable f => Representable (Rep f) |

## Representable Lenses

repLens :: Representable f => Lens a b -> Lens (f a) (f b)Source

We extend lens across a representable functor, due to the preservation of limits.

# Default definitions

## Functor

fmapRep :: Representable f => (a -> b) -> f a -> f bSource

## Distributive

distributeRep :: (Representable f, Functor w) => w (f a) -> f (w a)Source

## Keyed

mapWithKeyRep :: Representable f => (Key f -> a -> b) -> f a -> f bSource

## Apply/Applicative

apRep :: Representable f => f (a -> b) -> f a -> f bSource

pureRep :: Representable f => a -> f aSource

liftR2 :: Representable f => (a -> b -> c) -> f a -> f b -> f cSource

liftR3 :: Representable f => (a -> b -> c -> d) -> f a -> f b -> f c -> f dSource

## Bind/Monad

bindRep :: Representable f => f a -> (a -> f b) -> f bSource

bindWithKeyRep :: Representable f => f a -> (Key f -> a -> f b) -> f bSource

## Zip/ZipWithKey

zipWithRep :: Representable f => (a -> b -> c) -> f a -> f b -> f cSource

zipWithKeyRep :: Representable f => (Key f -> a -> b -> c) -> f a -> f b -> f cSource

## MonadReader

askRep :: Representable f => f (Key f)Source

localRep :: Representable f => (Key f -> Key f) -> f a -> f aSource

## Extend

duplicateRep :: (Representable f, Semigroup (Key f)) => f a -> f (f a)Source

extendRep :: (Representable f, Semigroup (Key f)) => (f a -> b) -> f a -> f bSource

## Comonad

extractRep :: (Indexable f, Monoid (Key f)) => f a -> aSource