Safe Haskell | None |
---|---|
Language | Haskell2010 |
Extensions |
|
Synopsis
- data Arr f a b where
- arrArr :: (b -> c) -> Arr f b c
- mapArr :: f b c -> Arr f a b -> Arr f a c
- foldArr :: forall f arr a b. Arrow arr => (forall x y. f x y -> arr x y) -> Arr f a b -> arr a b
- newtype A f a b = A {}
- fromA :: A f a b -> Arr f a b
- toA :: Arr f a b -> A f a b
- class FreeAlgebra2 (m :: (k -> k -> Type) -> k -> k -> Type) where
- liftFree2 :: AlgebraType0 m f => f a b -> m f a b
- foldNatFree2 :: (AlgebraType m d, AlgebraType0 m f) => (forall (x :: k) (y :: k). f x y -> d x y) -> m f a b -> d a b
- codom2 :: AlgebraType0 m f => Proof (AlgebraType m (m f)) (m f)
- forget2 :: AlgebraType m f => Proof (AlgebraType0 m f) (m f)
- wrapFree2 :: (AlgebraType0 m f, FreeAlgebra2 m, Monad (m f a)) => f a (m f a b) -> m f a b
- foldFree2 :: (FreeAlgebra2 m, AlgebraType m f) => m f a b -> f a b
- hoistFree2 :: (FreeAlgebra2 m, AlgebraType0 m g, AlgebraType0 m f) => (forall (x :: k) (y :: k). f x y -> g x y) -> m f a b -> m g a b
- joinFree2 :: (FreeAlgebra2 m, AlgebraType0 m f) => m (m f) a b -> m f a b
- bindFree2 :: (FreeAlgebra2 m, AlgebraType0 m g, AlgebraType0 m f) => m f a b -> (forall (x :: k) (y :: k). f x y -> m g x y) -> m g a b
Free arrow
Id :: Arr f a a | |
Arr :: (b -> c) -> Arr f a b -> Arr f a c | |
Prod :: Arr f a b -> Arr f a c -> Arr f a (b, c) |
Instances
Arrow (Arr f) Source # | |
FreeAlgebra2 Arr Source # | |
Defined in Control.Arrow.Free liftFree2 :: AlgebraType0 Arr f => f a b -> Arr f a b # foldNatFree2 :: (AlgebraType Arr d, AlgebraType0 Arr f) => (forall (x :: k) (y :: k). f x y -> d x y) -> Arr f a b -> d a b # codom2 :: AlgebraType0 Arr f => Proof (AlgebraType Arr (Arr f)) (Arr f) # forget2 :: AlgebraType Arr f => Proof (AlgebraType0 Arr f) (Arr f) # | |
Category (Arr f :: Type -> Type -> Type) Source # | |
Semigroup (Arr f o o) Source # | |
Monoid (Arr f o o) Source # | |
type AlgebraType0 Arr (f :: l) Source # | |
Defined in Control.Arrow.Free | |
type AlgebraType Arr (c :: Type -> Type -> Type) Source # | |
Defined in Control.Arrow.Free |
foldArr :: forall f arr a b. Arrow arr => (forall x y. f x y -> arr x y) -> Arr f a b -> arr a b Source #
Free arrow (CPS style)
Free arrow using CPS sytle.
Instances
Arrow (A f) Source # | |
FreeAlgebra2 A Source # | |
Defined in Control.Arrow.Free liftFree2 :: AlgebraType0 A f => f a b -> A f a b # foldNatFree2 :: (AlgebraType A d, AlgebraType0 A f) => (forall (x :: k) (y :: k). f x y -> d x y) -> A f a b -> d a b # codom2 :: AlgebraType0 A f => Proof (AlgebraType A (A f)) (A f) # forget2 :: AlgebraType A f => Proof (AlgebraType0 A f) (A f) # | |
Category (A f :: Type -> Type -> Type) Source # | |
Semigroup (A f o o) Source # | |
Monoid (A f o o) Source # | |
type AlgebraType0 A (f :: l) Source # | |
Defined in Control.Arrow.Free | |
type AlgebraType A (c :: Type -> Type -> Type) Source # | |
Defined in Control.Arrow.Free |
fromA :: A f a b -> Arr f a b Source #
Inverse of
, which also is a specialisatin of fromA
.hoistFreeH2
toA :: Arr f a b -> A f a b Source #
Isomorphism from
to Arr
, which is a specialisation of
A
.hoistFreeH2
Free interface re-exports
class FreeAlgebra2 (m :: (k -> k -> Type) -> k -> k -> Type) where #
Free algebra class similar to
and FreeAlgebra1
, but for
types of kind FreeAlgebra
k -> k -> Type
.
liftFree2 :: AlgebraType0 m f => f a b -> m f a b #
Lift a graph f
satsifying the constraint
to
a free its object AlgebraType0
m f
.
foldNatFree2 :: (AlgebraType m d, AlgebraType0 m f) => (forall (x :: k) (y :: k). f x y -> d x y) -> m f a b -> d a b #
This represents the theorem that m f
is indeed free object (as
in propositions as types). The types of kind k -> k -> Type
form
a category, where an arrow from f :: k -> k -> Type
to d :: k ->
k -> Type
is represented by type forall x y. f x y -> d x y
.
foldNatFree2
states that whenever we have such a morphism and d
satisfies the constraint AlgebraType m d
then we can construct
a morphism from m f
to d
.
foldNatFree2 nat (liftFree2 tr) = nat tr
foldNatFree2 nat . foldNatFree2 nat' = foldNatFree2 (foldNatFree2 nat . nat')
codom2 :: AlgebraType0 m f => Proof (AlgebraType m (m f)) (m f) #
A proof that for each f
satisfying AlgebraType0 m f
, m f
satisfies AlgebraType m (m f)
constrant. This means that m
is
a well defined functor from the full sub-category of types of
kind k -> k -> Type
which satisfy the AlgebraType0 m
constraint
to the full subcategory of types of the same kind which satifsfy
the constraint AlgebraType m
.
forget2 :: AlgebraType m f => Proof (AlgebraType0 m f) (m f) #
A proof that each type f :: k -> k -> Type
satisfying the
Algebra m f
constraint also satisfies AlgebraType0 m f
. This
states that there is a well defined forgetful functor from the
category of types of kind k -> k -> Type
which satisfy the
AlgebraType m
to the category of types of the same kind which
satisfy the AlgebraType0 m
constraint.
Instances
wrapFree2 :: (AlgebraType0 m f, FreeAlgebra2 m, Monad (m f a)) => f a (m f a b) -> m f a b #
Version of wrap
from free
package but for graphs.
foldFree2 :: (FreeAlgebra2 m, AlgebraType m f) => m f a b -> f a b #
hoistFree2 :: (FreeAlgebra2 m, AlgebraType0 m g, AlgebraType0 m f) => (forall (x :: k) (y :: k). f x y -> g x y) -> m f a b -> m g a b #
Hoist the underlying graph in the free structure.
This is a higher version of a functor (analogous to
, which
defined functor instance for fmapFree
instances) and it satisfies the
functor laws:FreeAlgebra
hoistFree2 id = id
hoistFree2 f . hoistFree2 g = hoistFree2 (f . g)
joinFree2 :: (FreeAlgebra2 m, AlgebraType0 m f) => m (m f) a b -> m f a b #
FreeAlgebra2
m is a monad on some subcategory of graphs (types of kind
k -> k -> Type
@), joinFree
it is the join
of this monad.
foldNatFree2 nat . joinFree2 = foldNatFree2 (foldNatFree2 nat)
This property is analogous to foldMap f . concat = foldMap (foldMap f)
,
bindFree2 :: (FreeAlgebra2 m, AlgebraType0 m g, AlgebraType0 m f) => m f a b -> (forall (x :: k) (y :: k). f x y -> m g x y) -> m g a b #
bind
of the monad defined by m
on the subcategory of graphs (types of
kind k -> k -> Type
).
foldNatFree2 nat (bindFree mf nat') = foldNatFree2 (foldNatFree2 nat . nat') mf