-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Haskell 98 comonads -- -- Haskell 98 comonads @package comonad @version 0.1.1 -- | A Comonad is the categorical dual of a Monad. module Control.Comonad -- | 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 f :: (* -> *) fmap :: Functor f => (a -> b) -> f a -> f b (<$) :: Functor f => a -> f b -> f a -- | 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 Functor w => Comonad w extract :: Comonad w => w a -> a duplicate :: Comonad w => w a -> w (w a) extend :: Comonad w => (w a -> b) -> w a -> w b -- | 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. class Comonad w => ComonadZip w (<.>) :: ComonadZip w => w (a -> b) -> w a -> w b (.>) :: ComonadZip w => w a -> w b -> w b (<.) :: ComonadZip w => w a -> w b -> w a -- | The Cokleisli Arrows of a given Comonad newtype Cokleisli w a b Cokleisli :: (w a -> b) -> Cokleisli w a b runCokleisli :: Cokleisli w a b -> w a -> b -- | Left-to-right Cokleisli composition (=>=) :: Comonad w => (w a -> b) -> (w b -> c) -> w a -> c -- | Right-to-left Cokleisli composition (=<=) :: Comonad w => (w b -> c) -> (w a -> b) -> w a -> c -- | extend with the arguments swapped. Dual to >>= for -- a Monad. (=>>) :: Comonad w => w a -> (w a -> b) -> w b -- | extend in operator form (<<=) :: Comonad w => (w a -> b) -> w a -> w b (<..>) :: ComonadZip w => w a -> w (a -> b) -> w b -- | Comonadic fixed point wfix :: Comonad w => w (w a -> a) -> a -- | A generalized comonadic list anamorphism unfoldW :: Comonad w => (w b -> (a, b)) -> w b -> [a] -- | A suitable default definition for fmap for a Comonad. -- Promotes a function to a comonad. 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 wa wb = (,) <$> wa <.> wb -- wzip = liftW2 (,) ---- -- Called czip in Essence of Dataflow Programming wzip :: ComonadZip w => w a -> w b -> w (a, b) instance Monad (Cokleisli w a) instance Functor (Cokleisli w a) instance ComonadZip d => ArrowLoop (Cokleisli d) instance Comonad w => ArrowChoice (Cokleisli w) instance Comonad w => ArrowApply (Cokleisli w) instance Comonad w => Category (Cokleisli w) instance Comonad w => Arrow (Cokleisli w) instance ComonadZip w => ComonadZip (IdentityT w) instance ComonadZip Identity instance Monoid m => ComonadZip ((->) m) instance Monoid m => ComonadZip ((,) m) instance Comonad w => Comonad (IdentityT w) instance Comonad Identity instance Monoid m => Comonad ((->) m) instance Comonad ((,) e)