free- Monads for free

PortabilityMPTCs, fundeps
MaintainerEdward Kmett <>
Safe HaskellSafe-Infered




Cofree comonads



data Cofree f a Source


a :< (f (Cofree f a)) 


ComonadTrans Cofree 
ComonadEnv e w => ComonadEnv e (Cofree w) 
ComonadStore s w => ComonadStore s (Cofree w) 
ComonadTraced m w => ComonadTraced m (Cofree w) 
Functor f => ComonadCofree f (Cofree f) 
Functor f => Functor (Cofree f) 
Typeable1 f => Typeable1 (Cofree f) 
Applicative f => Applicative (Cofree f) 
Foldable f => Foldable (Cofree f) 
Traversable f => Traversable (Cofree f) 
Functor f => Comonad (Cofree f) 
Functor f => Extend (Cofree f) 
Distributive f => Distributive (Cofree f) 
Traversable1 f => Traversable1 (Cofree f) 
Foldable1 f => Foldable1 (Cofree f) 
Apply f => Apply (Cofree f) 
(Eq (f (Cofree f a)), Eq a) => Eq (Cofree f a) 
(Typeable1 f, Data (f (Cofree f a)), Data a) => Data (Cofree f a) 
(Ord (f (Cofree f a)), Ord a) => Ord (Cofree f a) 
(Read (f (Cofree f a)), Read a) => Read (Cofree f a) 
(Show (f (Cofree f a)), Show a) => Show (Cofree f a) 
(Typeable1 f, Typeable a) => Typeable (Cofree f a) 

section :: Comonad f => f a -> Cofree f aSource

lower . section = id

unwrap :: ComonadCofree f w => w a -> f (w a)Source

coiter :: Functor f => (a -> f a) -> a -> Cofree f aSource

unfold :: Functor f => (b -> (a, f b)) -> b -> Cofree f aSource

Lenses into cofree comonads

unwrapLens :: Lens (Cofree f a) (f (Cofree f a))Source

telescope :: [Lens (f (Cofree f a)) (Cofree f a)] -> Lens (Cofree f a) aSource

We'd prefer the following non-Haskell 98 type to make parametricity clearer, but this suffices

 telescope :: (forall b. [Lens (f b) b]) -> Lens (Cofree f a) a