| License | BSD-style (see the file LICENSE) |
|---|---|
| Maintainer | sjoerd@w3future.com |
| Stability | experimental |
| Portability | non-portable |
| Safe Haskell | None |
| Language | Haskell2010 |
Data.Functor.Free
Description
A free functor is left adjoint to a forgetful functor. In this package the forgetful functor forgets class constraints.
Synopsis
- newtype Free c a = Free {
- runFree :: forall b. c b => (a -> b) -> b
- deriveInstances :: Name -> Q [Dec]
- unit :: a -> Free c a
- rightAdjunct :: c b => (a -> b) -> Free c a -> b
- counit :: c a => Free c a -> a
- leftAdjunct :: (Free c a -> b) -> a -> b
- transform :: (forall r. c r => (b -> r) -> a -> r) -> Free c a -> Free c b
- unfold :: (b -> Coproduct c b a) -> b -> Free c a
- convert :: (c (f a), Applicative f) => Free c a -> f a
- convertClosed :: c r => Free c Void -> r
- newtype Extract a = Extract {
- getExtract :: a
- newtype Duplicate f a = Duplicate {
- getDuplicate :: f (f a)
- type Coproduct c m n = Free c (Either m n)
- coproduct :: c r => (m -> r) -> (n -> r) -> Coproduct c m n -> r
- inL :: m -> Coproduct c m n
- inR :: n -> Coproduct c m n
- type InitialObject c = Free c Void
- initial :: c r => InitialObject c -> r
- data ShowHelper f a
- = ShowUnit a
- | ShowRec (f (ShowHelper f a))
Documentation
The free functor for class c.
Free c a is basically an expression tree with operations from class c
and variables/placeholders of type a, created with unit.
Monadic bind allows you to replace each of these variables with another sub-expression.
Instances
| (forall x. c x => Class' f x) => Algebra f (Free c a) Source # | |
Defined in Data.Functor.Free.Internal | |
| Monad (Free c) Source # | |
| Functor (Free c) Source # | |
| Applicative (Free c) Source # | |
| (forall (f :: Type -> Type) x. Applicative f => c (LiftAFree c f x)) => Foldable (Free c) Source # | |
Defined in Data.Functor.Free.Internal Methods fold :: Monoid m => Free c m -> m # foldMap :: Monoid m => (a -> m) -> Free c a -> m # foldr :: (a -> b -> b) -> b -> Free c a -> b # foldr' :: (a -> b -> b) -> b -> Free c a -> b # foldl :: (b -> a -> b) -> b -> Free c a -> b # foldl' :: (b -> a -> b) -> b -> Free c a -> b # foldr1 :: (a -> a -> a) -> Free c a -> a # foldl1 :: (a -> a -> a) -> Free c a -> a # elem :: Eq a => a -> Free c a -> Bool # maximum :: Ord a => Free c a -> a # minimum :: Ord a => Free c a -> a # | |
| (forall (f :: Type -> Type) x. Applicative f => c (LiftAFree c f x)) => Traversable (Free c) Source # | |
| (forall x. c (Extract x), forall x. c (Duplicate (Free c) x)) => Comonad (Free c) Source # | |
| (forall x. c x :=> Floating x) => Floating (Free c a) Source # | |
Defined in Data.Functor.Free Methods sqrt :: Free c a -> Free c a # (**) :: Free c a -> Free c a -> Free c a # logBase :: Free c a -> Free c a -> Free c a # asin :: Free c a -> Free c a # acos :: Free c a -> Free c a # atan :: Free c a -> Free c a # sinh :: Free c a -> Free c a # cosh :: Free c a -> Free c a # tanh :: Free c a -> Free c a # asinh :: Free c a -> Free c a # acosh :: Free c a -> Free c a # atanh :: Free c a -> Free c a # log1p :: Free c a -> Free c a # expm1 :: Free c a -> Free c a # | |
| (forall x. c x :=> Fractional x) => Fractional (Free c a) Source # | |
| (forall x. c x :=> Num x) => Num (Free c a) Source # | |
| (Show a, Show (Signature c (ShowHelper (Signature c) a)), c (ShowHelper (Signature c) a)) => Show (Free c a) Source # | |
| (forall x. c x :=> Semigroup x) => Semigroup (Free c a) Source # | |
| (forall x. c x :=> Monoid x) => Monoid (Free c a) Source # | |
deriveInstances :: Name -> Q [Dec] Source #
Derive the instances of for the class Free c ac, Show, Foldable and Traversable.
For example:
deriveInstances ''Num
rightAdjunct :: c b => (a -> b) -> Free c a -> b Source #
rightAdjunct is the destructor of values.Free c
leftAdjunct :: (Free c a -> b) -> a -> b Source #
leftAdjunct f = f . unit
transform :: (forall r. c r => (b -> r) -> a -> r) -> Free c a -> Free c b Source #
transform f as = as >>= f unit
transform f . transform g = transform (g . f)
convert :: (c (f a), Applicative f) => Free c a -> f a Source #
convert = rightAdjunct pure
convertClosed :: c r => Free c Void -> r Source #
convertClosed = rightAdjunct absurd
Constructors
| Extract | |
Fields
| |
newtype Duplicate f a Source #
Constructors
| Duplicate | |
Fields
| |
Coproducts
type Coproduct c m n = Free c (Either m n) Source #
Products of Monoids are Monoids themselves. But coproducts of Monoids are not.
However, the free Monoid applied to the coproduct is a Monoid, and it is the coproduct in the category of Monoids.
This is also called the free product, and generalizes to any algebraic class.
type InitialObject c = Free c Void Source #
initial :: c r => InitialObject c -> r Source #
Internal
data ShowHelper f a Source #
Constructors
| ShowUnit a | |
| ShowRec (f (ShowHelper f a)) |
Instances
| Algebra f (ShowHelper f a) Source # | |
Defined in Data.Functor.Free.Internal Methods algebra :: f (ShowHelper f a) -> ShowHelper f a # | |
| (Show a, Show (f (ShowHelper f a))) => Show (ShowHelper f a) Source # | |
Defined in Data.Functor.Free.Internal Methods showsPrec :: Int -> ShowHelper f a -> ShowS # show :: ShowHelper f a -> String # showList :: [ShowHelper f a] -> ShowS # | |
Orphan instances
| (forall x. c x :=> Floating x) => Floating (Free c a) Source # | |
Methods sqrt :: Free c a -> Free c a # (**) :: Free c a -> Free c a -> Free c a # logBase :: Free c a -> Free c a -> Free c a # asin :: Free c a -> Free c a # acos :: Free c a -> Free c a # atan :: Free c a -> Free c a # sinh :: Free c a -> Free c a # cosh :: Free c a -> Free c a # tanh :: Free c a -> Free c a # asinh :: Free c a -> Free c a # acosh :: Free c a -> Free c a # atanh :: Free c a -> Free c a # log1p :: Free c a -> Free c a # expm1 :: Free c a -> Free c a # | |
| (forall x. c x :=> Fractional x) => Fractional (Free c a) Source # | |
| (forall x. c x :=> Num x) => Num (Free c a) Source # | |
| (forall x. c x :=> Semigroup x) => Semigroup (Free c a) Source # | |
| (forall x. c x :=> Monoid x) => Monoid (Free c a) Source # | |
| (Applicative f, forall x. c x :=> Floating x) => Floating (LiftAFree c f a) Source # | |
Methods exp :: LiftAFree c f a -> LiftAFree c f a # log :: LiftAFree c f a -> LiftAFree c f a # sqrt :: LiftAFree c f a -> LiftAFree c f a # (**) :: LiftAFree c f a -> LiftAFree c f a -> LiftAFree c f a # logBase :: LiftAFree c f a -> LiftAFree c f a -> LiftAFree c f a # sin :: LiftAFree c f a -> LiftAFree c f a # cos :: LiftAFree c f a -> LiftAFree c f a # tan :: LiftAFree c f a -> LiftAFree c f a # asin :: LiftAFree c f a -> LiftAFree c f a # acos :: LiftAFree c f a -> LiftAFree c f a # atan :: LiftAFree c f a -> LiftAFree c f a # sinh :: LiftAFree c f a -> LiftAFree c f a # cosh :: LiftAFree c f a -> LiftAFree c f a # tanh :: LiftAFree c f a -> LiftAFree c f a # asinh :: LiftAFree c f a -> LiftAFree c f a # acosh :: LiftAFree c f a -> LiftAFree c f a # atanh :: LiftAFree c f a -> LiftAFree c f a # log1p :: LiftAFree c f a -> LiftAFree c f a # expm1 :: LiftAFree c f a -> LiftAFree c f a # | |
| (Applicative f, forall x. c x :=> Fractional x) => Fractional (LiftAFree c f a) Source # | |
| (Applicative f, forall x. c x :=> Num x) => Num (LiftAFree c f a) Source # | |
Methods (+) :: LiftAFree c f a -> LiftAFree c f a -> LiftAFree c f a # (-) :: LiftAFree c f a -> LiftAFree c f a -> LiftAFree c f a # (*) :: LiftAFree c f a -> LiftAFree c f a -> LiftAFree c f a # negate :: LiftAFree c f a -> LiftAFree c f a # abs :: LiftAFree c f a -> LiftAFree c f a # signum :: LiftAFree c f a -> LiftAFree c f a # fromInteger :: Integer -> LiftAFree c f a # | |
| (Applicative f, forall x. c x :=> Semigroup x) => Semigroup (LiftAFree c f a) Source # | |
| (Applicative f, forall x. c x :=> Monoid x) => Monoid (LiftAFree c f a) Source # | |