Copyright | (c) 2011 Patrick Bahr |
---|---|
License | BSD3 |
Maintainer | Patrick Bahr <paba@diku.dk> |
Stability | experimental |
Portability | non-portable (GHC Extensions) |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
This module provides operators on higher-order functors. All definitions are generalised versions of those in Data.Comp.Ops.
Synopsis
- class RemA (s :: (Type -> Type) -> Type -> Type) s' | s -> s' where
- class DistAnn (s :: (Type -> Type) -> Type -> Type) p s' | s' -> s, s' -> p where
- data (f :&: a) (g :: Type -> Type) e = (f g e) :&: a
- type (:=:) f g = (f :<: g, g :<: f)
- type (:<:) f g = Subsume (ComprEmb (Elem f g)) f g
- class Subsume (e :: Emb) (f :: (Type -> Type) -> Type -> Type) (g :: (Type -> Type) -> Type -> Type) where
- type family Elem (f :: (Type -> Type) -> Type -> Type) (g :: (Type -> Type) -> Type -> Type) :: Emb where ...
- data (f :+: g) (h :: Type -> Type) e
- caseH :: (f a b -> c) -> (g a b -> c) -> (f :+: g) a b -> c
- inj :: forall f g a. f :<: g => f a :-> g a
- proj :: forall f g a. f :<: g => NatM Maybe (g a) (f a)
- spl :: f :=: (f1 :+: f2) => (f1 a :-> b) -> (f2 a :-> b) -> f a :-> b
- data (f :*: g) a = (f a) :*: (g a)
- ffst :: (f :*: g) a -> f a
- fsnd :: (f :*: g) a -> g a
Documentation
class DistAnn (s :: (Type -> Type) -> Type -> Type) p s' | s' -> s, s' -> p where Source #
This class defines how to distribute an annotation over a sum of signatures.
data (f :&: a) (g :: Type -> Type) e infixr 7 Source #
This data type adds a constant product to a signature. Alternatively, this could have also been defined as
data (f :&: a) (g :: Type -> Type) e = f g e :&: a e
This is too general, however, for example for productHHom
.
(f g e) :&: a infixr 7 |
Instances
DistAnn f p (f :&: p) Source # | |
(ShowHF f, Show p) => ShowHF (f :&: p) Source # | |
HFoldable f => HFoldable (f :&: a) Source # | |
Defined in Data.Comp.Multi.Ops hfold :: Monoid m => (f :&: a) (K m) :=> m Source # hfoldMap :: forall m (a0 :: Type -> Type). Monoid m => (a0 :=> m) -> (f :&: a) a0 :=> m Source # hfoldr :: forall (a0 :: Type -> Type) b. (a0 :=> (b -> b)) -> b -> (f :&: a) a0 :=> b Source # hfoldl :: forall b (a0 :: Type -> Type). (b -> a0 :=> b) -> b -> (f :&: a) a0 :=> b Source # hfoldr1 :: (a0 -> a0 -> a0) -> (f :&: a) (K a0) :=> a0 Source # hfoldl1 :: (a0 -> a0 -> a0) -> (f :&: a) (K a0) :=> a0 Source # | |
HFunctor f => HFunctor (f :&: a) Source # | |
HTraversable f => HTraversable (f :&: a) Source # | |
Defined in Data.Comp.Multi.Ops hmapM :: forall (m :: Type -> Type) (a0 :: Type -> Type) (b :: Type -> Type). Monad m => NatM m a0 b -> NatM m ((f :&: a) a0) ((f :&: a) b) Source # htraverse :: forall (f0 :: Type -> Type) (a0 :: Type -> Type) (b :: Type -> Type). Applicative f0 => NatM f0 a0 b -> NatM f0 ((f :&: a) a0) ((f :&: a) b) Source # | |
RemA (f :&: p) f Source # | |
DistAnn s p s' => DistAnn (f :+: s) p ((f :&: p) :+: s') Source # | |
RemA s s' => RemA ((f :&: p) :+: s) (f :+: s') Source # | |
type (:<:) f g = Subsume (ComprEmb (Elem f g)) f g infixl 5 Source #
A constraint f :<: g
expresses that the signature f
is
subsumed by g
, i.e. f
can be used to construct elements in g
.
class Subsume (e :: Emb) (f :: (Type -> Type) -> Type -> Type) (g :: (Type -> Type) -> Type -> Type) where Source #
type family Elem (f :: (Type -> Type) -> Type -> Type) (g :: (Type -> Type) -> Type -> Type) :: Emb where ... Source #
data (f :+: g) (h :: Type -> Type) e infixr 6 Source #
Data type defining coproducts.
Instances
(ShowHF f, ShowHF g) => ShowHF (f :+: g) Source # | |
(EqHF f, EqHF g) => EqHF (f :+: g) Source # |
|
(HFoldable f, HFoldable g) => HFoldable (f :+: g) Source # | |
Defined in Data.Comp.Multi.Ops hfold :: Monoid m => (f :+: g) (K m) :=> m Source # hfoldMap :: forall m (a :: Type -> Type). Monoid m => (a :=> m) -> (f :+: g) a :=> m Source # hfoldr :: forall (a :: Type -> Type) b. (a :=> (b -> b)) -> b -> (f :+: g) a :=> b Source # hfoldl :: forall b (a :: Type -> Type). (b -> a :=> b) -> b -> (f :+: g) a :=> b Source # | |
(HFunctor f, HFunctor g) => HFunctor (f :+: g) Source # | |
(HTraversable f, HTraversable g) => HTraversable (f :+: g) Source # | |
Defined in Data.Comp.Multi.Ops hmapM :: forall (m :: Type -> Type) (a :: Type -> Type) (b :: Type -> Type). Monad m => NatM m a b -> NatM m ((f :+: g) a) ((f :+: g) b) Source # htraverse :: forall (f0 :: Type -> Type) (a :: Type -> Type) (b :: Type -> Type). Applicative f0 => NatM f0 a b -> NatM f0 ((f :+: g) a) ((f :+: g) b) Source # | |
(OrdHF f, OrdHF g) => OrdHF (f :+: g) Source # |
|
(Desugar f h, Desugar g h) => Desugar (f :+: g) h Source # | |
(HasVars f v, HasVars g v) => HasVars (f :+: g) v Source # | |
DistAnn s p s' => DistAnn (f :+: s) p ((f :&: p) :+: s') Source # | |
RemA s s' => RemA ((f :&: p) :+: s) (f :+: s') Source # | |
caseH :: (f a b -> c) -> (g a b -> c) -> (f :+: g) a b -> c Source #
Utility function to case on a higher-order functor sum, without exposing the internal representation of sums.
data (f :*: g) a infixr 8 Source #
Formal product of signatures (functors).
(f a) :*: (g a) infixr 8 |
Instances
(Foldable f, Foldable g) => Foldable (f :*: g) Source # | |
Defined in Data.Comp.Ops fold :: Monoid m => (f :*: g) m -> m # foldMap :: Monoid m => (a -> m) -> (f :*: g) a -> m # foldMap' :: Monoid m => (a -> m) -> (f :*: g) a -> m # foldr :: (a -> b -> b) -> b -> (f :*: g) a -> b # foldr' :: (a -> b -> b) -> b -> (f :*: g) a -> b # foldl :: (b -> a -> b) -> b -> (f :*: g) a -> b # foldl' :: (b -> a -> b) -> b -> (f :*: g) a -> b # foldr1 :: (a -> a -> a) -> (f :*: g) a -> a # foldl1 :: (a -> a -> a) -> (f :*: g) a -> a # toList :: (f :*: g) a -> [a] # length :: (f :*: g) a -> Int # elem :: Eq a => a -> (f :*: g) a -> Bool # maximum :: Ord a => (f :*: g) a -> a # minimum :: Ord a => (f :*: g) a -> a # | |
(Traversable f, Traversable g) => Traversable (f :*: g) Source # | |
(Functor f, Functor g) => Functor (f :*: g) Source # | |