free-4.12.4: Monads for free

Copyright(C) 2008-2013 Edward Kmett
LicenseBSD-style (see the file LICENSE)
MaintainerEdward Kmett <ekmett@gmail.com>
Stabilityprovisional
PortabilityMPTCs, fundeps
Safe HaskellSafe
LanguageHaskell2010

Control.Comonad.Trans.Coiter

Contents

Description

The coiterative comonad generated by a comonad

Synopsis

Documentation

Coiterative comonads represent non-terminating, productive computations.

They are the dual notion of iterative monads. While iterative computations produce no values or eventually terminate with one, coiterative computations constantly produce values and they never terminate.

It's simpler form, Coiter, is an infinite stream of data. CoiterT extends this so that each step of the computation can be performed in a comonadic context.

The coiterative comonad transformer

newtype CoiterT w a #

This is the coiterative comonad generated by a comonad

Constructors

CoiterT 

Fields

Instances

ComonadTrans CoiterT # 

Methods

lower :: Comonad w => CoiterT w a -> w a #

ComonadHoist CoiterT # 

Methods

cohoist :: (Comonad w, Comonad v) => (forall x. w x -> v x) -> CoiterT w a -> CoiterT v a #

ComonadTraced m w => ComonadTraced m (CoiterT w) # 

Methods

trace :: m -> CoiterT w a -> a #

ComonadStore s w => ComonadStore s (CoiterT w) # 

Methods

pos :: CoiterT w a -> s #

peek :: s -> CoiterT w a -> a #

peeks :: (s -> s) -> CoiterT w a -> a #

seek :: s -> CoiterT w a -> CoiterT w a #

seeks :: (s -> s) -> CoiterT w a -> CoiterT w a #

experiment :: Functor f => (s -> f s) -> CoiterT w a -> f a #

ComonadEnv e w => ComonadEnv e (CoiterT w) # 

Methods

ask :: CoiterT w a -> e #

Comonad w => ComonadCofree Identity (CoiterT w) # 

Methods

unwrap :: CoiterT w a -> Identity (CoiterT w a) #

Functor w => Functor (CoiterT w) # 

Methods

fmap :: (a -> b) -> CoiterT w a -> CoiterT w b #

(<$) :: a -> CoiterT w b -> CoiterT w a #

Foldable w => Foldable (CoiterT w) # 

Methods

fold :: Monoid m => CoiterT w m -> m #

foldMap :: Monoid m => (a -> m) -> CoiterT w a -> m #

foldr :: (a -> b -> b) -> b -> CoiterT w a -> b #

foldr' :: (a -> b -> b) -> b -> CoiterT w a -> b #

foldl :: (b -> a -> b) -> b -> CoiterT w a -> b #

foldl' :: (b -> a -> b) -> b -> CoiterT w a -> b #

foldr1 :: (a -> a -> a) -> CoiterT w a -> a #

foldl1 :: (a -> a -> a) -> CoiterT w a -> a #

toList :: CoiterT w a -> [a] #

null :: CoiterT w a -> Bool #

length :: CoiterT w a -> Int #

elem :: Eq a => a -> CoiterT w a -> Bool #

maximum :: Ord a => CoiterT w a -> a #

minimum :: Ord a => CoiterT w a -> a #

sum :: Num a => CoiterT w a -> a #

product :: Num a => CoiterT w a -> a #

Traversable w => Traversable (CoiterT w) # 

Methods

traverse :: Applicative f => (a -> f b) -> CoiterT w a -> f (CoiterT w b) #

sequenceA :: Applicative f => CoiterT w (f a) -> f (CoiterT w a) #

mapM :: Monad m => (a -> m b) -> CoiterT w a -> m (CoiterT w b) #

sequence :: Monad m => CoiterT w (m a) -> m (CoiterT w a) #

Comonad w => Comonad (CoiterT w) # 

Methods

extract :: CoiterT w a -> a #

duplicate :: CoiterT w a -> CoiterT w (CoiterT w a) #

extend :: (CoiterT w a -> b) -> CoiterT w a -> CoiterT w b #

(Functor w, Eq1 w) => Eq1 (CoiterT w) # 

Methods

(==#) :: Eq a => CoiterT w a -> CoiterT w a -> Bool #

(Functor w, Ord1 w) => Ord1 (CoiterT w) # 

Methods

compare1 :: Ord a => CoiterT w a -> CoiterT w a -> Ordering #

(Functor w, Show1 w) => Show1 (CoiterT w) # 

Methods

showsPrec1 :: Show a => Int -> CoiterT w a -> ShowS #

showList1 :: Show a => [CoiterT w a] -> ShowS #

(Functor w, Read1 w) => Read1 (CoiterT w) # 

Methods

readsPrec1 :: Read a => Int -> ReadS (CoiterT w a) #

readList1 :: Read a => ReadS [CoiterT w a] #

Eq (w (a, CoiterT w a)) => Eq (CoiterT w a) # 

Methods

(==) :: CoiterT w a -> CoiterT w a -> Bool #

(/=) :: CoiterT w a -> CoiterT w a -> Bool #

(Typeable (* -> *) w, Typeable * a, Data (w (a, CoiterT w a)), Data a) => Data (CoiterT w a) # 

Methods

gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> CoiterT w a -> c (CoiterT w a) #

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (CoiterT w a) #

toConstr :: CoiterT w a -> Constr #

dataTypeOf :: CoiterT w a -> DataType #

dataCast1 :: Typeable (* -> *) t => (forall d. Data d => c (t d)) -> Maybe (c (CoiterT w a)) #

dataCast2 :: Typeable (* -> * -> *) t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c (CoiterT w a)) #

gmapT :: (forall b. Data b => b -> b) -> CoiterT w a -> CoiterT w a #

gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> CoiterT w a -> r #

gmapQr :: (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> CoiterT w a -> r #

gmapQ :: (forall d. Data d => d -> u) -> CoiterT w a -> [u] #

gmapQi :: Int -> (forall d. Data d => d -> u) -> CoiterT w a -> u #

gmapM :: Monad m => (forall d. Data d => d -> m d) -> CoiterT w a -> m (CoiterT w a) #

gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> CoiterT w a -> m (CoiterT w a) #

gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> CoiterT w a -> m (CoiterT w a) #

Ord (w (a, CoiterT w a)) => Ord (CoiterT w a) # 

Methods

compare :: CoiterT w a -> CoiterT w a -> Ordering #

(<) :: CoiterT w a -> CoiterT w a -> Bool #

(<=) :: CoiterT w a -> CoiterT w a -> Bool #

(>) :: CoiterT w a -> CoiterT w a -> Bool #

(>=) :: CoiterT w a -> CoiterT w a -> Bool #

max :: CoiterT w a -> CoiterT w a -> CoiterT w a #

min :: CoiterT w a -> CoiterT w a -> CoiterT w a #

Read (w (a, CoiterT w a)) => Read (CoiterT w a) # 
Show (w (a, CoiterT w a)) => Show (CoiterT w a) # 

Methods

showsPrec :: Int -> CoiterT w a -> ShowS #

show :: CoiterT w a -> String #

showList :: [CoiterT w a] -> ShowS #

The coiterative comonad

type Coiter = CoiterT Identity #

The coiterative comonad

coiter :: a -> Coiter a -> Coiter a #

Prepends a result to a coiterative computation.

runCoiter . uncurry coiter == id

runCoiter :: Coiter a -> (a, Coiter a) #

Extracts the first result from a coiterative computation.

uncurry coiter . runCoiter == id

Generating coiterative comonads

unfold :: Comonad w => (w a -> a) -> w a -> CoiterT w a #

Unfold a CoiterT comonad transformer from a cokleisli arrow and an initial comonadic seed.

Cofree comonads

class (Functor f, Comonad w) => ComonadCofree f w | w -> f where #

Allows you to peel a layer off a cofree comonad.

Minimal complete definition

unwrap

Methods

unwrap :: w a -> f (w a) #

Remove a layer.

Instances

ComonadCofree [] Tree # 

Methods

unwrap :: Tree a -> [Tree a] #

ComonadCofree Maybe NonEmpty # 

Methods

unwrap :: NonEmpty a -> Maybe (NonEmpty a) #

Functor f => ComonadCofree f (Cofree f) # 

Methods

unwrap :: Cofree f a -> f (Cofree f a) #

Comonad w => ComonadCofree Identity (CoiterT w) # 

Methods

unwrap :: CoiterT w a -> Identity (CoiterT w a) #

(ComonadCofree f w, Monoid m) => ComonadCofree f (TracedT m w) # 

Methods

unwrap :: TracedT m w a -> f (TracedT m w a) #

ComonadCofree f w => ComonadCofree f (StoreT s w) # 

Methods

unwrap :: StoreT s w a -> f (StoreT s w a) #

ComonadCofree f w => ComonadCofree f (EnvT e w) # 

Methods

unwrap :: EnvT e w a -> f (EnvT e w a) #

ComonadCofree f w => ComonadCofree f (IdentityT * w) # 

Methods

unwrap :: IdentityT * w a -> f (IdentityT * w a) #

(Functor f, Comonad w) => ComonadCofree f (CofreeT f w) # 

Methods

unwrap :: CofreeT f w a -> f (CofreeT f w a) #

ComonadCofree (Const * b) ((,) b) # 

Methods

unwrap :: (b, a) -> Const * b (b, a) #

Examples