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

Portabilityportable
Stabilityprovisional
MaintainerEdward Kmett <ekmett@gmail.com>

Control.Comonad.Apply

Contents

Description

A Comonad is the categorical dual of a Monad.

Synopsis

FunctorApply

ComonadApply - strong lax symmetric semimonoidal comonads

class (Comonad w, Apply 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 Apply that:

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

Instances

ComonadApply Identity 
(Monoid m, Semigroup 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