-- 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.3 -- | 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 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 TypeFun fun => TypeFun (FunMap trans fun) instance (Domain fun ~ Domain fun', TypeFun fun, TypeFun fun') => TypeFun (fun :-> fun') instance Kind dom => TypeFun (Const dom val) instance Kind dom => TypeFun (Id dom)