compdata-param-0.9.2: Parametric Compositional Data Types

Copyright(c) 2011 Patrick Bahr Tom Hvitved
LicenseBSD3
MaintainerTom Hvitved <hvitved@diku.dk>
Stabilityexperimental
Portabilitynon-portable (GHC Extensions)
Safe HaskellSafe
LanguageHaskell98

Data.Comp.Param.Multi.Ops

Description

This module provides operators on higher-order difunctors.

Synopsis
  • data (f :+: g) (a :: * -> *) (b :: * -> *) i
    • = Inl (f a b i)
    • | Inr (g a b i)
  • caseHD :: (f a b i -> c) -> (g a b i -> c) -> (f :+: g) a b i -> c
  • class (sub :: (* -> *) -> (* -> *) -> * -> *) :<: sup where
    • data (f :*: g) a b i = (f a b i) :*: (g a b i)
    • ffst :: (f :*: g) a b :-> f a b
    • fsnd :: (f :*: g) a b :-> g a b
    • data (f :&: p) (a :: * -> *) (b :: * -> *) i = (f a b i) :&: p
    • class DistAnn (s :: (* -> *) -> (* -> *) -> * -> *) p s' | s' -> s, s' -> p where
      • class RemA (s :: (* -> *) -> (* -> *) -> * -> *) s' | s -> s' where

        Documentation

        data (f :+: g) (a :: * -> *) (b :: * -> *) i infixr 6 Source #

        Formal sum of signatures (difunctors).

        Constructors

        Inl (f a b i) 
        Inr (g a b i) 
        Instances
        f :<: g => f :<: (h :+: g) Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Ops

        Methods

        inj :: f a b i -> (h :+: g) a b i Source #

        proj :: (h :+: g) a b i -> Maybe (f a b i) Source #

        f :<: (f :+: g) Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Ops

        Methods

        inj :: f a b i -> (f :+: g) a b i Source #

        proj :: (f :+: g) a b i -> Maybe (f a b i) Source #

        (HDifunctor f, HDifunctor g) => HDifunctor (f :+: g) Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Ops

        Methods

        hdimap :: (a :-> b) -> (c :-> d) -> (f :+: g) b c :-> (f :+: g) a d Source #

        (ShowHD f, ShowHD g) => ShowHD (f :+: g) Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Show

        Methods

        showHD :: (f :+: g) Name (K (FreshM String)) i -> FreshM String Source #

        (HDitraversable f, HDitraversable g) => HDitraversable (f :+: g) Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Ops

        Methods

        hdimapM :: Monad m => NatM m b c -> NatM m ((f :+: g) a b) ((f :+: g) a c) Source #

        (EqHD f, EqHD g) => EqHD (f :+: g) Source #

        EqHD is propagated through sums.

        Instance details

        Defined in Data.Comp.Param.Multi.Equality

        Methods

        eqHD :: PEq a => (f :+: g) Name a i -> (f :+: g) Name a j -> FreshM Bool Source #

        (OrdHD f, OrdHD g) => OrdHD (f :+: g) Source #

        OrdHD is propagated through sums.

        Instance details

        Defined in Data.Comp.Param.Multi.Ordering

        Methods

        compareHD :: POrd a => (f :+: g) Name a i -> (f :+: g) Name a j -> FreshM Ordering Source #

        (Desugar f h, Desugar g h) => Desugar (f :+: g) h Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Desugar

        Methods

        desugHom :: Hom (f :+: g) h Source #

        desugHom' :: (f :+: g) a (Cxt h0 h a b) i -> Cxt h0 h a b i Source #

        DistAnn s p s' => DistAnn (f :+: s) p ((f :&: p) :+: s') Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Ops

        Methods

        injectA :: p -> (f :+: s) a b :-> ((f :&: p) :+: s') a b Source #

        projectA :: ((f :&: p) :+: s') a b i -> ((f :+: s) a b :&: p) i Source #

        RemA s s' => RemA ((f :&: p) :+: s) (f :+: s') Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Ops

        Methods

        remA :: ((f :&: p) :+: s) a b i -> (f :+: s') a b i Source #

        (Eq (f a b i), Eq (g a b i)) => Eq ((f :+: g) a b i) # 
        Instance details

        Defined in Data.Comp.Param.Multi.Sum

        Methods

        (==) :: (f :+: g) a b i -> (f :+: g) a b i -> Bool #

        (/=) :: (f :+: g) a b i -> (f :+: g) a b i -> Bool #

        (Ord (f a b i), Ord (g a b i)) => Ord ((f :+: g) a b i) # 
        Instance details

        Defined in Data.Comp.Param.Multi.Sum

        Methods

        compare :: (f :+: g) a b i -> (f :+: g) a b i -> Ordering #

        (<) :: (f :+: g) a b i -> (f :+: g) a b i -> Bool #

        (<=) :: (f :+: g) a b i -> (f :+: g) a b i -> Bool #

        (>) :: (f :+: g) a b i -> (f :+: g) a b i -> Bool #

        (>=) :: (f :+: g) a b i -> (f :+: g) a b i -> Bool #

        max :: (f :+: g) a b i -> (f :+: g) a b i -> (f :+: g) a b i #

        min :: (f :+: g) a b i -> (f :+: g) a b i -> (f :+: g) a b i #

        (Show (f a b i), Show (g a b i)) => Show ((f :+: g) a b i) # 
        Instance details

        Defined in Data.Comp.Param.Multi.Sum

        Methods

        showsPrec :: Int -> (f :+: g) a b i -> ShowS #

        show :: (f :+: g) a b i -> String #

        showList :: [(f :+: g) a b i] -> ShowS #

        caseHD :: (f a b i -> c) -> (g a b i -> c) -> (f :+: g) a b i -> c Source #

        Utility function to case on a higher-order difunctor sum, without exposing the internal representation of sums.

        class (sub :: (* -> *) -> (* -> *) -> * -> *) :<: sup where Source #

        Signature containment relation for automatic injections. The left-hand must be an atomic signature, where as the right-hand side must have a list-like structure. Examples include f :<: f :+: g and g :<: f :+: (g :+: h), non-examples include f :+: g :<: f :+: (g :+: h) and f :<: (f :+: g) :+: h.

        Minimal complete definition

        inj, proj

        Methods

        inj :: sub a b :-> sup a b Source #

        proj :: NatM Maybe (sup a b) (sub a b) Source #

        Instances
        f :<: f Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Ops

        Methods

        inj :: f a b i -> f a b i Source #

        proj :: f a b i -> Maybe (f a b i) Source #

        f :<: g => f :<: (h :+: g) Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Ops

        Methods

        inj :: f a b i -> (h :+: g) a b i Source #

        proj :: (h :+: g) a b i -> Maybe (f a b i) Source #

        f :<: (f :+: g) Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Ops

        Methods

        inj :: f a b i -> (f :+: g) a b i Source #

        proj :: (f :+: g) a b i -> Maybe (f a b i) Source #

        data (f :*: g) a b i infixr 8 Source #

        Formal product of signatures (higher-order difunctors).

        Constructors

        (f a b i) :*: (g a b i) infixr 8 

        ffst :: (f :*: g) a b :-> f a b Source #

        fsnd :: (f :*: g) a b :-> g a b Source #

        data (f :&: p) (a :: * -> *) (b :: * -> *) i infixr 7 Source #

        This data type adds a constant product to a signature.

        Constructors

        (f a b i) :&: p infixr 7 
        Instances
        DistAnn f p (f :&: p) Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Ops

        Methods

        injectA :: p -> f a b :-> (f :&: p) a b Source #

        projectA :: (f :&: p) a b i -> (f a b :&: p) i Source #

        HDifunctor f => HDifunctor (f :&: p) Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Ops

        Methods

        hdimap :: (a :-> b) -> (c :-> d) -> (f :&: p) b c :-> (f :&: p) a d Source #

        (ShowHD f, Show p) => ShowHD (f :&: p) Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Show

        Methods

        showHD :: (f :&: p) Name (K (FreshM String)) i -> FreshM String Source #

        HDitraversable f => HDitraversable (f :&: p) Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Ops

        Methods

        hdimapM :: Monad m => NatM m b c -> NatM m ((f :&: p) a b) ((f :&: p) a c) Source #

        RemA (f :&: p) f Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Ops

        Methods

        remA :: (f :&: p) a b i -> f a b i Source #

        DistAnn s p s' => DistAnn (f :+: s) p ((f :&: p) :+: s') Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Ops

        Methods

        injectA :: p -> (f :+: s) a b :-> ((f :&: p) :+: s') a b Source #

        projectA :: ((f :&: p) :+: s') a b i -> ((f :+: s) a b :&: p) i Source #

        RemA s s' => RemA ((f :&: p) :+: s) (f :+: s') Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Ops

        Methods

        remA :: ((f :&: p) :+: s) a b i -> (f :+: s') a b i Source #

        class DistAnn (s :: (* -> *) -> (* -> *) -> * -> *) p s' | s' -> s, s' -> p where Source #

        This class defines how to distribute an annotation over a sum of signatures.

        Minimal complete definition

        injectA, projectA

        Methods

        injectA :: p -> s a b :-> s' a b Source #

        Inject an annotation over a signature.

        projectA :: s' a b :-> (s a b :&: p) Source #

        Project an annotation from a signature.

        Instances
        DistAnn f p (f :&: p) Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Ops

        Methods

        injectA :: p -> f a b :-> (f :&: p) a b Source #

        projectA :: (f :&: p) a b i -> (f a b :&: p) i Source #

        DistAnn s p s' => DistAnn (f :+: s) p ((f :&: p) :+: s') Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Ops

        Methods

        injectA :: p -> (f :+: s) a b :-> ((f :&: p) :+: s') a b Source #

        projectA :: ((f :&: p) :+: s') a b i -> ((f :+: s) a b :&: p) i Source #

        class RemA (s :: (* -> *) -> (* -> *) -> * -> *) s' | s -> s' where Source #

        Minimal complete definition

        remA

        Methods

        remA :: s a b :-> s' a b Source #

        Remove annotations from a signature.

        Instances
        RemA (f :&: p) f Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Ops

        Methods

        remA :: (f :&: p) a b i -> f a b i Source #

        RemA s s' => RemA ((f :&: p) :+: s) (f :+: s') Source # 
        Instance details

        Defined in Data.Comp.Param.Multi.Ops

        Methods

        remA :: ((f :&: p) :+: s) a b i -> (f :+: s') a b i Source #