Portability | portable |
---|---|

Stability | provisional |

Maintainer | Edward Kmett <ekmett@gmail.com> |

- module Control.Comonad
- module Data.Functor.Apply
- class (Comonad w, Apply w) => ComonadApply w
- liftW2 :: ComonadApply w => (a -> b -> c) -> w a -> w b -> w c
- liftW3 :: ComonadApply w => (a -> b -> c -> d) -> w a -> w b -> w c -> w d

# FunctorApply

module Control.Comonad

module Data.Functor.Apply

# 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
FunctorApply that:

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

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