Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
Representation of types as constructor + list of types.
Synopsis
- data LoT k where
- type family (f :: k) :@@: (tys :: LoT k) where ...
- type LoT1 (a :: k) = a ':&&: 'LoT0
- type LoT2 (a :: k) (b :: k1) = a ':&&: (b ':&&: 'LoT0)
- type family HeadLoT (tys :: LoT (k -> k')) :: k where ...
- type family TailLoT (tys :: LoT (k -> k')) :: LoT k' where ...
- type family SpineLoT (tys :: LoT k) = (tys' :: LoT k) | tys' -> k tys where ...
- data SLoT (l :: LoT k) where
- class SForLoT (l :: LoT k) where
- data Proxy (t :: k) = Proxy
- type SplitF (t :: d) (f :: k) = SplitF' t f 'LoT0
- data Nat
- data TyEnv where
- type family SplitN (n :: Nat) t :: TyEnv where ...
Lists of types and application
LoT k
represents a list of types which can be applied
to a data type of kind k
.
type family (f :: k) :@@: (tys :: LoT k) where ... Source #
Apply a list of types to a type constructor.
>>>
:kind! Either :@@: (Int :&&: Bool :&&: LoT0)
Either Int Bool :: Type
type family HeadLoT (tys :: LoT (k -> k')) :: k where ... Source #
Head of a non-empty list of types.
>>>
:kind! HeadLoT (Int :&&: LoT0)
Int :: Type
type family TailLoT (tys :: LoT (k -> k')) :: LoT k' where ... Source #
Tail of a non-empty list of types.
>>>
:kind! TailLoT (Int :&&: Bool :&&: LoT0)
Bool :&&: LoT0 :: LoT (Type -> Type)
type family SpineLoT (tys :: LoT k) = (tys' :: LoT k) | tys' -> k tys where ... Source #
Construct the spine of a list of types whose length is known.
It can be useful to introduce unification variables for lists of types which
will be fully instantiated during constraint resolution.
A constraint p ~ SpineLoT p
will thus instantiate the spine of p
.
On concrete lists, this is the identity function.
Singleton for list of types
Proxy
is a type that holds no data, but has a phantom parameter of
arbitrary type (or even kind). Its use is to provide type information, even
though there is no value available of that type (or it may be too costly to
create one).
Historically,
is a safer alternative to the
Proxy
:: Proxy
a
idiom.undefined
:: a
>>>
Proxy :: Proxy (Void, Int -> Int)
Proxy
Proxy can even hold types of higher kinds,
>>>
Proxy :: Proxy Either
Proxy
>>>
Proxy :: Proxy Functor
Proxy
>>>
Proxy :: Proxy complicatedStructure
Proxy
Instances
Generic1 (Proxy :: k -> Type) | |
Defined in GHC.Generics | |
MonadZip (Proxy :: Type -> Type) | Since: base-4.9.0.0 |
Foldable (Proxy :: Type -> Type) | Since: base-4.7.0.0 |
Defined in Data.Foldable fold :: Monoid m => Proxy m -> m # foldMap :: Monoid m => (a -> m) -> Proxy a -> m # foldMap' :: Monoid m => (a -> m) -> Proxy a -> m # foldr :: (a -> b -> b) -> b -> Proxy a -> b # foldr' :: (a -> b -> b) -> b -> Proxy a -> b # foldl :: (b -> a -> b) -> b -> Proxy a -> b # foldl' :: (b -> a -> b) -> b -> Proxy a -> b # foldr1 :: (a -> a -> a) -> Proxy a -> a # foldl1 :: (a -> a -> a) -> Proxy a -> a # elem :: Eq a => a -> Proxy a -> Bool # maximum :: Ord a => Proxy a -> a # minimum :: Ord a => Proxy a -> a # | |
Eq1 (Proxy :: Type -> Type) | Since: base-4.9.0.0 |
Ord1 (Proxy :: Type -> Type) | Since: base-4.9.0.0 |
Defined in Data.Functor.Classes | |
Read1 (Proxy :: Type -> Type) | Since: base-4.9.0.0 |
Defined in Data.Functor.Classes | |
Show1 (Proxy :: Type -> Type) | Since: base-4.9.0.0 |
Contravariant (Proxy :: Type -> Type) | |
Traversable (Proxy :: Type -> Type) | Since: base-4.7.0.0 |
Alternative (Proxy :: Type -> Type) | Since: base-4.9.0.0 |
Applicative (Proxy :: Type -> Type) | Since: base-4.7.0.0 |
Functor (Proxy :: Type -> Type) | Since: base-4.7.0.0 |
Monad (Proxy :: Type -> Type) | Since: base-4.7.0.0 |
MonadPlus (Proxy :: Type -> Type) | Since: base-4.9.0.0 |
Data t => Data (Proxy t) | Since: base-4.7.0.0 |
Defined in Data.Data gfoldl :: (forall d b. Data d => c (d -> b) -> d -> c b) -> (forall g. g -> c g) -> Proxy t -> c (Proxy t) # gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c (Proxy t) # toConstr :: Proxy t -> Constr # dataTypeOf :: Proxy t -> DataType # dataCast1 :: Typeable t0 => (forall d. Data d => c (t0 d)) -> Maybe (c (Proxy t)) # dataCast2 :: Typeable t0 => (forall d e. (Data d, Data e) => c (t0 d e)) -> Maybe (c (Proxy t)) # gmapT :: (forall b. Data b => b -> b) -> Proxy t -> Proxy t # gmapQl :: (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> Proxy t -> r # gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> Proxy t -> r # gmapQ :: (forall d. Data d => d -> u) -> Proxy t -> [u] # gmapQi :: Int -> (forall d. Data d => d -> u) -> Proxy t -> u # gmapM :: Monad m => (forall d. Data d => d -> m d) -> Proxy t -> m (Proxy t) # gmapMp :: MonadPlus m => (forall d. Data d => d -> m d) -> Proxy t -> m (Proxy t) # gmapMo :: MonadPlus m => (forall d. Data d => d -> m d) -> Proxy t -> m (Proxy t) # | |
Monoid (Proxy s) | Since: base-4.7.0.0 |
Semigroup (Proxy s) | Since: base-4.9.0.0 |
Bounded (Proxy t) | Since: base-4.7.0.0 |
Enum (Proxy s) | Since: base-4.7.0.0 |
Generic (Proxy t) | |
Ix (Proxy s) | Since: base-4.7.0.0 |
Defined in Data.Proxy | |
Read (Proxy t) | Since: base-4.7.0.0 |
Show (Proxy s) | Since: base-4.7.0.0 |
Eq (Proxy s) | Since: base-4.7.0.0 |
Ord (Proxy s) | Since: base-4.7.0.0 |
type Rep1 (Proxy :: k -> Type) | Since: base-4.6.0.0 |
type Rep (Proxy t) | Since: base-4.6.0.0 |
Splitting types
type SplitF (t :: d) (f :: k) = SplitF' t f 'LoT0 Source #
Split a type t
until the constructor f
is found.
>>>
:kind! SplitF (Either Int Bool) Either
Int :&&: Bool :&&: LoT0 :: LoT (Type -> Type -> Type)>>>
:kind! SplitF (Either Int Bool) (Either Int)
Bool :&&: LoT0 :: LoT (Type -> Type)
A type constructor and a list of types that can be applied to it.