-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | Emulation of type-level functions -- -- This package supports emulation of type-level functions using -- defunctionalization. All functions whose domain is a subkind of -- * and whose codomain is * itself can be represented. -- -- For detailed information, please refer to Subsection 3.2 of the paper -- Generic Record Combinators with Static Type Checking. @package type-functions @version 0.2.0.4 -- | Emulation of type-level functions. module Data.TypeFun -- | Type-level functions are represented by types. TypeFun is the -- class of all type-level function representations. class (Kind (Domain fun)) => TypeFun fun where type Domain fun where { type family Domain fun; } -- | Application of type-level functions. App takes a function -- representation and an argument and returns the corresponding result. -- | A type Id d represents the type-level identity -- function whose domain is represented by d. data Id dom Id :: dom -> Id dom -- | A type Const d v represents the constant -- type-level function whose domain is represented by d, -- and whose result is v. data Const dom val Const :: dom -> Const dom val -- | A type f :-> f' represents the type-level -- function \arg -> (App f arg -> App -- f' arg). data (:->) fun fun' (:->) :: fun -> fun' -> (:->) fun fun' -- | If t is a type of kind * -> *, and -- f is the representation of a type-level function, -- FunMap t f represents the function \arg -- -> t (App f arg). data FunMap (trans :: * -> *) fun -- | A data type that is isomorphic to the type synonym family App. newtype WrappedApp fun arg WrapApp :: (App fun arg) -> WrappedApp fun arg -- | The inverse of WrapApp. unwrapApp :: WrappedApp fun arg -> App fun arg -- | Turns a type-level function into the intersection of all its results. type Universal fun = forall arg. (Inhabitant (Domain fun) arg) => WrappedApp fun arg instance Data.Kind.Kind dom => Data.TypeFun.TypeFun (Data.TypeFun.Id dom) instance Data.Kind.Kind dom => Data.TypeFun.TypeFun (Data.TypeFun.Const dom val) instance (Data.TypeFun.TypeFun fun, Data.TypeFun.TypeFun fun', Data.TypeFun.Domain fun ~ Data.TypeFun.Domain fun') => Data.TypeFun.TypeFun (fun Data.TypeFun.:-> fun') instance Data.TypeFun.TypeFun fun => Data.TypeFun.TypeFun (Data.TypeFun.FunMap trans fun)