Portability | portable |
---|---|
Stability | provisional |
Maintainer | Edward Kmett <ekmett@gmail.com> |
- class Functor f where
- class Functor w => Comonad w where
- class Comonad w => ComonadZip w where
- newtype Cokleisli w a b = Cokleisli {
- runCokleisli :: w a -> b
- (=>=) :: Comonad w => (w a -> b) -> (w b -> c) -> w a -> c
- (=<=) :: Comonad w => (w b -> c) -> (w a -> b) -> w a -> c
- (=>>) :: Comonad w => w a -> (w a -> b) -> w b
- (<<=) :: Comonad w => (w a -> b) -> w a -> w b
- (<..>) :: ComonadZip w => w a -> w (a -> b) -> w b
- wfix :: Comonad w => w (w a -> a) -> a
- unfoldW :: Comonad w => (w b -> (a, b)) -> w b -> [a]
- liftW :: Comonad w => (a -> b) -> w a -> w b
- liftW2 :: ComonadZip w => (a -> b -> c) -> w a -> w b -> w c
- liftW3 :: ComonadZip w => (a -> b -> c -> d) -> w a -> w b -> w c -> w d
- wzip :: ComonadZip w => w a -> w b -> w (a, b)
Functor and Comonad
class Functor f where
The Functor
class is used for types that can be mapped over.
Instances of Functor
should satisfy the following laws:
fmap id == id fmap (f . g) == fmap f . fmap g
The instances of Functor
for lists, Data.Maybe.Maybe
and System.IO.IO
satisfy these laws.
class Functor w => Comonad w whereSource
There are two ways to define a comonad:
I. Provide definitions for fmap
, extract
, and duplicate
satisfying these laws:
extract . duplicate == id fmap extract . duplicate == id duplicate . duplicate == fmap duplicate . duplicate
II. Provide definitions for extract
and extend
satisfying these laws:
extend extract == id extract . extend f == f extend f . extend g == extend (f . extend g)
(fmap
cannot be defaulted, but a comonad which defines
extend
may simply set fmap
equal to liftW
.)
A comonad providing definitions for extend
and duplicate
,
must also satisfy these laws:
extend f == fmap f . duplicate duplicate == extend id fmap f == extend (f . extract)
(The first two are the defaults for extend
and duplicate
,
and the third is the definition of liftW
.)
class Comonad w => ComonadZip w whereSource
As a symmetric semi-monoidal comonad, an instance of ComonadZip is required to satisfy:
extract (wzip a b) = (extract a, extract b)
By extension, the following law must also hold:
extract (a <.> b) = extract a (extract b)
Minimum definition: <.>
Based on the ComonadZip from The Essence of Dataflow Programming by Tarmo Uustalu and Varmo Vene, but adapted to fit the conventions of Control.Monad and to provide a similar programming style to that of Control.Applicative.
(<.>) :: w (a -> b) -> w a -> w bSource
(<.>) = liftW2 id
(.>) :: w a -> w b -> w bSource
(.>) = liftW2 (const id)
(<.) :: w a -> w b -> w aSource
(<.) = liftW2 const
ComonadZip Identity | |
Monoid m => ComonadZip ((->) m) | |
Monoid m => ComonadZip ((,) m) | |
ComonadZip w => ComonadZip (IdentityT w) |
newtype Cokleisli w a b Source
Cokleisli | |
|
Functions
Naming conventions
The functions in this library use the following naming conventions, based on those of Control.Monad.
- A postfix '
W
' always stands for a function in the Cokleisli category: The monad type constructorw
is added to function results (modulo currying) and nowhere else. So, for example,
filter :: (a -> Bool) -> [a] -> [a] filterW :: (Comonad w) => (w a -> Bool) -> w [a] -> [a]
- A prefix '
w
' generalizes an existing function to a comonadic form. Thus, for example:
fix :: (a -> a) -> a wfix :: w (w a -> a) -> a
When ambiguous, consistency with existing Control.Monad combinators supercedes other naming considerations.
Operators
(<..>) :: ComonadZip w => w a -> w (a -> b) -> w bSource
Fixed points and folds
Comonadic lifting
liftW2 :: ComonadZip w => (a -> b -> c) -> w a -> w b -> w cSource
liftW3 :: ComonadZip w => (a -> b -> c -> d) -> w a -> w b -> w c -> w dSource
wzip :: ComonadZip w => w a -> w b -> w (a, b)Source
wzip wa wb = (,) <$> wa <.> wb wzip = liftW2 (,)
Called czip
in Essence of Dataflow Programming