Copyright | (C) 2011-2016 Edward Kmett |
---|---|

License | BSD-style (see the file LICENSE) |

Maintainer | Edward Kmett <ekmett@gmail.com> |

Stability | provisional |

Portability | portable |

Safe Haskell | Trustworthy |

Language | Haskell98 |

## Synopsis

- class GDistributive g where
- genericCollect :: (Functor f, Generic1 g, GDistributive (Rep1 g)) => (a -> g b) -> f a -> g (f b)
- genericDistribute :: (Functor f, Generic1 g, GDistributive (Rep1 g)) => f (g a) -> g (f a)

# Documentation

class GDistributive g where #

## Instances

GDistributive Par1 # | |

GDistributive (U1 :: Type -> Type) # | |

Distributive f => GDistributive (Rec1 f) # | |

(GDistributive a, GDistributive b) => GDistributive (a :*: b) # | |

GDistributive f => GDistributive (M1 i c f) # | |

(Distributive a, GDistributive b) => GDistributive (a :.: b) # | |

genericCollect :: (Functor f, Generic1 g, GDistributive (Rep1 g)) => (a -> g b) -> f a -> g (f b) #

`collect`

derived from a `Generic1`

type

This can be used to easily produce a `Distributive`

instance for a
type with a `Generic1`

instance,

data V2 a = V2 a a deriving (Show, Functor, Generic1) instance Distributive V2' where collect = genericCollect

genericDistribute :: (Functor f, Generic1 g, GDistributive (Rep1 g)) => f (g a) -> g (f a) #

`distribute`

derived from a `Generic1`

type

It's often more efficient to use `genericCollect`

instead.