genifunctors

Last updated: 2016-11-14 11:24:41 +0100

Upstream URL: git clone http://chriswarbo.net/git/genifunctors.git

Repo

View repository

View issue tracker

Contents of README.md follows


Generate (derive) generalized <code>fmap</code>, <code>foldMap</code> and <code>traverse</code> for <code>Bifunctors</code>, <code>Trifunctors</code>, or a functor with any arity

Example:

<pre><code>data U a b c d = L [U a b c d] -- polymorphic recursion | M (V (a,b) (Either c d)) -- mutually recursive | a :+: Int -- infix syntax, record syntax, type synonyms | R { c :: c, d :: String } -- and primitive data types supported data V u v = X (U v v u u) | Z u fmapU :: (a -> a') -> (b -> b') -> (c -> c') -> (d -> d') -> U a b c d -> U a' b' c' d' fmapU = $(genFmap ''U) foldU :: Monoid m => (a -> m) -> (b -> m) -> (c -> m) -> (d -> m) -> U a b c d -> m foldU = $(genFoldMap ''U) travU :: Applicative f => (a -> f a') -> (b -> f b') -> (c -> f c') -> (d -> f d') -> U a b c d -> f (U a' b' c' d') travU = $(genTraverse ''U)</code></pre>