free-functors-1.2.1: Free functors, adjoint to functors that forget class constraints.
LicenseBSD-style (see the file LICENSE)
Maintainersjoerd@w3future.com
Stabilityexperimental
Portabilitynon-portable
Safe HaskellNone
LanguageHaskell2010

Data.Functor.HFree

Description

A free functor is left adjoint to a forgetful functor. In this package the forgetful functor forgets class constraints.

Compared to Data.Functor.Free we're going up a level. These free functors go between categories of functors and the natural transformations between them.

Synopsis

Documentation

type (:~>) f g = forall b. f b -> g b Source #

Natural transformations.

newtype HFree c f a Source #

The higher order free functor for constraint c.

Constructors

HFree 

Fields

Instances

Instances details
(c ~=> Monad, c (HFree c f)) => Monad (HFree c f) Source #

The free monad of a functor.

Instance details

Defined in Data.Functor.HFree

Methods

(>>=) :: HFree c f a -> (a -> HFree c f b) -> HFree c f b #

(>>) :: HFree c f a -> HFree c f b -> HFree c f b #

return :: a -> HFree c f a #

(c ~=> Functor, c (HFree c a)) => Functor (HFree c a) Source # 
Instance details

Defined in Data.Functor.HFree

Methods

fmap :: (a0 -> b) -> HFree c a a0 -> HFree c a b #

(<$) :: a0 -> HFree c a b -> HFree c a a0 #

(c ~=> Applicative, c (HFree c a)) => Applicative (HFree c a) Source # 
Instance details

Defined in Data.Functor.HFree

Methods

pure :: a0 -> HFree c a a0 #

(<*>) :: HFree c a (a0 -> b) -> HFree c a a0 -> HFree c a b #

liftA2 :: (a0 -> b -> c0) -> HFree c a a0 -> HFree c a b -> HFree c a c0 #

(*>) :: HFree c a a0 -> HFree c a b -> HFree c a b #

(<*) :: HFree c a a0 -> HFree c a b -> HFree c a a0 #

(c ~=> Contravariant, c (HFree c a)) => Contravariant (HFree c a) Source # 
Instance details

Defined in Data.Functor.HFree

Methods

contramap :: (a' -> a0) -> HFree c a a0 -> HFree c a a' #

(>$) :: b -> HFree c a b -> HFree c a a0 #

(c ~=> Alternative, c (HFree c a)) => Alternative (HFree c a) Source # 
Instance details

Defined in Data.Functor.HFree

Methods

empty :: HFree c a a0 #

(<|>) :: HFree c a a0 -> HFree c a a0 -> HFree c a a0 #

some :: HFree c a a0 -> HFree c a [a0] #

many :: HFree c a a0 -> HFree c a [a0] #

(c ~=> Decidable, c (HFree c a)) => Decidable (HFree c a) Source # 
Instance details

Defined in Data.Functor.HFree

Methods

lose :: (a0 -> Void) -> HFree c a a0

choose :: (a0 -> Either b c0) -> HFree c a b -> HFree c a c0 -> HFree c a a0

(c ~=> Divisible, c (HFree c a)) => Divisible (HFree c a) Source # 
Instance details

Defined in Data.Functor.HFree

Methods

divide :: (a0 -> (b, c0)) -> HFree c a b -> HFree c a c0 -> HFree c a a0

conquer :: HFree c a a0

deriveHFreeInstance :: Name -> Q [Dec] Source #

Derive the instance of HFree c f a for the class c,.

For example:

deriveHFreeInstance ''Functor

unit :: f :~> HFree c f Source #

rightAdjunct :: c g => (f :~> g) -> HFree c f :~> g Source #

counit :: c f => HFree c f :~> f Source #

counit = rightAdjunct id

leftAdjunct :: (HFree c f :~> g) -> f :~> g Source #

leftAdjunct f = f . unit

transform :: (forall r. c r => (g :~> r) -> f :~> r) -> HFree c f :~> HFree c g Source #

hfmap :: (f :~> g) -> HFree c f :~> HFree c g Source #

bind :: (f :~> HFree c g) -> HFree c f :~> HFree c g Source #

liftFree :: f a -> HFree c f a Source #

lowerFree :: c f => HFree c f a -> f a Source #

convert :: (c (t f), Monad f, MonadTrans t) => HFree c f a -> t f a Source #

iter :: c Identity => (forall b. f b -> b) -> HFree c f a -> a Source #

wrap :: f (HFree Monad f a) -> HFree Monad f a Source #