distributive-0.4.4: Distributive functors -- Dual to Traversable

Copyright | (C) 2011-2014 Edward Kmett
License | BSD-style (see the file LICENSE)
Maintainer | Edward Kmett <ekmett@gmail.com>
Stability | provisional
Portability | portable
Safe Haskell | Safe
Language | Haskell98

Data.Distributive.Generic

Description

Synopsis

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

# Documentation

class GDistributive g where Source

Methods

gdistribute :: Functor f => f (g a) -> g (f a) Source

Instances

GDistributive U1 Source |
GDistributive Par1 Source |
GDistributive f => GDistributive (Rec1 f) Source |
(GDistributive a, GDistributive b) => GDistributive ((:*:) a b) Source |
(Functor a, Functor b, GDistributive a, GDistributive b) => GDistributive ((:.:) a b) Source |
GDistributive f => GDistributive (M1 i c f) Source |

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

`distribute` 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 distribute = genericDistribute