functor-apply-0.6.0: 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, 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

Instances

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

Only requires a Semigroup, but no such class exists

Monoid m => ComonadApply ((,) m)

Only requires a Semigroup, but no such class exists

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