Portability | portable |
---|---|
Stability | provisional |
Maintainer | Edward Kmett <ekmett@gmail.com> |
Safe Haskell | Safe-Inferred |
- class Functor g => Distributive g where
- distribute :: Functor f => f (g a) -> g (f a)
- collect :: Functor f => (a -> g b) -> f a -> g (f b)
- distributeM :: Monad m => m (g a) -> g (m a)
- collectM :: Monad m => (a -> g b) -> m a -> g (m b)
- cotraverse :: (Functor f, Distributive g) => (f a -> b) -> f (g a) -> g b
- comapM :: (Monad m, Distributive g) => (m a -> b) -> m (g a) -> g b
Documentation
class Functor g => Distributive g whereSource
This is the categorical dual of Traversable
.
Due to the lack of non-trivial comonoids in Haskell, we can restrict
ourselves to requiring a Functor
rather than
some Coapplicative class. Categorically every Distributive
functor is actually a right adjoint, and so it must be Representable
endofunctor and preserve all limits. This is a fancy way of saying it
isomorphic to `(->) x` for some x.
Minimal complete definition: distribute
or collect
To be distributable a container will need to have a way to consistently zip a potentially infinite number of copies of itself. This effectively means that the holes in all values of that type, must have the same cardinality, fixed sized vectors, infinite streams, functions, etc. and no extra information to try to merge together.
distribute :: Functor f => f (g a) -> g (f a)Source
collect :: Functor f => (a -> g b) -> f a -> g (f b)Source
collect
f =distribute
.fmap
f
distributeM :: Monad m => m (g a) -> g (m a)Source
The dual of sequence
distributeM
=fmap
unwrapMonad
.distribute
.WrapMonad
collectM :: Monad m => (a -> g b) -> m a -> g (m b)Source
collectM
=distributeM
.liftM
f
Distributive Identity | |
Distributive ((->) e) | |
Distributive f => Distributive (Backwards f) | |
Distributive g => Distributive (IdentityT g) | |
Distributive f => Distributive (Reverse f) | |
Distributive g => Distributive (ReaderT e g) | |
(Distributive f, Distributive g) => Distributive (Compose f g) | |
(Distributive f, Distributive g) => Distributive (Product f g) |
cotraverse :: (Functor f, Distributive g) => (f a -> b) -> f (g a) -> g bSource
The dual of traverse
cotraverse
f =fmap
f .distribute
comapM :: (Monad m, Distributive g) => (m a -> b) -> m (g a) -> g bSource
The dual of mapM
comapM
f =fmap
f .distributeM