https://github.com/danr/genifunctors
Generate generalized fmap, foldMap and traverse
https://github.com/danr/genifunctors
Last synced: about 1 year ago
JSON representation
Generate generalized fmap, foldMap and traverse
- Host: GitHub
- URL: https://github.com/danr/genifunctors
- Owner: danr
- License: bsd-3-clause
- Created: 2013-09-07T17:19:55.000Z (almost 13 years ago)
- Default Branch: master
- Last Pushed: 2016-11-14T10:26:05.000Z (over 9 years ago)
- Last Synced: 2024-10-28T14:09:27.309Z (over 1 year ago)
- Language: Haskell
- Homepage: https://hackage.haskell.org/package/genifunctors
- Size: 37.1 KB
- Stars: 5
- Watchers: 5
- Forks: 2
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- Changelog: changelog
- License: LICENSE
Awesome Lists containing this project
README
Generate (derive) generalized `fmap`, `foldMap` and `traverse` for `Bifunctors`,
`Trifunctors`, or a functor with any arity
Example:
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)