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
is isomorphic to (->) x for some x.
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.
Methods
distribute :: Functor f => f (g a) -> g (f a)The dual of sequenceA
Example1 expression distribute [(+1),(+2)] 1[2,3]
distribute = collect id distribute . distribute = idcollect :: Functor f => (a -> g b) -> f a -> g (f b)collect f = distribute . fmap f fmap f = runIdentity . collect (Identity . f) fmap distribute . collect f = getCompose . collect (Compose . f)distributeM :: Monad m => m (g a) -> g (m a)The dual of
Data.Traversable.sequencedistributeM = fmap unwrapMonad . distribute . WrapMonadcollectM :: Monad m => (a -> g b) -> m a -> g (m b)collectM = distributeM . liftM f
Instances25Distributive, …
Distributive ComplexDefined in distributive-0.6.2.1 · Data.DistributiveDistributive FirstDefined in distributive-0.6.2.1 · Data.DistributiveDistributive LastDefined in distributive-0.6.2.1 · Data.DistributiveDistributive MaxDefined in distributive-0.6.2.1 · Data.DistributiveDistributive MinDefined in distributive-0.6.2.1 · Data.DistributiveDistributive IdentityDefined in distributive-0.6.2.1 · Data.DistributiveDistributive DualDefined in distributive-0.6.2.1 · Data.DistributiveDistributive ProductDefined in distributive-0.6.2.1 · Data.DistributiveDistributive SumDefined in distributive-0.6.2.1 · Data.DistributiveDistributive Par1Defined in distributive-0.6.2.1 · Data.DistributiveDistributive ProxyDefined in distributive-0.6.2.1 · Data.DistributiveDistributive U1Defined in distributive-0.6.2.1 · Data.Distributive(Distributive m, Monad m) => Distributive (WrappedMonad m)Defined in distributive-0.6.2.1 · Data.DistributiveDistributive (Tagged t)Defined in distributive-0.6.2.1 · Data.DistributiveDistributive f => Distributive (Rec1 f)Defined in distributive-0.6.2.1 · Data.DistributiveDistributive f => Distributive (Backwards f)Defined in distributive-0.6.2.1 · Data.DistributiveDistributive f => Distributive (Reverse f)Defined in distributive-0.6.2.1 · Data.DistributiveDistributive g => Distributive (IdentityT g)Defined in distributive-0.6.2.1 · Data.DistributiveDistributive g => Distributive (ReaderT e g)Defined in distributive-0.6.2.1 · Data.DistributiveDistributive ((->) e)Defined in distributive-0.6.2.1 · Data.Distributive(Distributive a, Distributive b) => Distributive (a :*: b)Defined in distributive-0.6.2.1 · Data.Distributive(Distributive f, Distributive g) => Distributive (Product f g)Defined in distributive-0.6.2.1 · Data.DistributiveDistributive f => Distributive (M1 i c f)Defined in distributive-0.6.2.1 · Data.Distributive(Distributive a, Distributive b) => Distributive (a :.: b)Defined in distributive-0.6.2.1 · Data.Distributive(Distributive f, Distributive g) => Distributive (Compose f g)Defined in distributive-0.6.2.1 · Data.Distributive