free-4.12.4: Monads for free

Copyright | (C) 2008-2013 Edward Kmett
License | BSD-style (see the file LICENSE)
Maintainer | Edward Kmett <ekmett@gmail.com>
Stability | provisional
Portability | MPTCs, fundeps
Safe Haskell | Safe
Language | Haskell2010

Control.Comonad.Trans.Coiter

Contents

- The coiterative comonad transformer
- The coiterative comonad
- Generating coiterative comonads
- Cofree comonads
- Examples

Description

The coiterative comonad generated by a comonad

Synopsis

- newtype CoiterT w a = CoiterT {
  - runCoiterT :: w (a, CoiterT w a)
  }
- type Coiter = CoiterT Identity
- coiter :: a -> Coiter a -> Coiter a
- runCoiter :: Coiter a -> (a, Coiter a)
- unfold :: Comonad w => (w a -> a) -> w a -> CoiterT w a
- class (Functor f, Comonad w) => ComonadCofree f w | w -> f where

# 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 runCoiterT :: w (a, CoiterT w a)

Instances

ComonadHoist CoiterT # |
Methods cohoist :: (Comonad w, Comonad v) => (forall x. w x -> v x) -> CoiterT w a -> CoiterT v a #
ComonadTrans CoiterT # |
Methods lower :: Comonad w => CoiterT w a -> w 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) # |
Methods readsPrec :: Int -> ReadS (CoiterT w a) # readList :: ReadS [CoiterT w a] # readPrec :: ReadPrec (CoiterT w a) # readListPrec :: ReadPrec [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

Newton's method