functor-apply-0.7.2: Strong lax semimonoidal endofunctors (Applicative sans pure)

MaintainerEdward Kmett <>




A Comonad is the categorical dual of a Monad.



ComonadApply - strong lax symmetric semimonoidal comonads

class (Comonad w, FunctorApply w) => ComonadApply w Source

A strong lax symmetric semi-monoidal comonad. As such an instance of ComonadApply is required to satisfy:

 extract (a <.> b) = extract a (extract b)

This class is based on ComonadZip from "The Essence of Dataflow Programming" by Tarmo Uustalu and Varmo Vene, but adapted to fit the programming style of Control.Applicative. Applicative can be seen as a similar law over and above FunctorApply that:

 pure (a b) = pure a <.> pure b


ComonadApply Identity 
Monoid m => ComonadApply ((->) m) 
(Monoid m, Semigroup m) => ComonadApply ((,) m)

Both required because Semigroup is not a superclass of Monoid

ComonadApply w => ComonadApply (IdentityT w) 
ComonadApply w => ComonadApply (MaybeApply w) 

liftW2 :: ComonadApply w => (a -> b -> c) -> w a -> w b -> w cSource

Lift a binary function into a comonad with zipping

liftW3 :: ComonadApply w => (a -> b -> c -> d) -> w a -> w b -> w c -> w dSource

Lift a ternary function into a comonad with zipping