The private type is what you are looking for:
{-
To fully answer your question, we need DataKinds to get lists of type types:
{-
A single quote indicates that we are using these (list) constructors at the type level.
We see that this gives the expected result with the command :kind! at ghci
λ> :kind! F (Int -> Float -> Double) F (Int -> Float -> Double) :: [*] = '[Int -> Float -> Double, Float -> Double, Double]
Note that the return type of F is [*] . This means that in order to use these results, you will need to somehow extract them from the list. The only type that has types that are habitable is * (well, and # ).
Types without tags
Regarding the full context: Perhaps you can do something like an unlabeled sum type by creating an Elem family of types using level levels (==) and (||) from Data.Type.Equality and Data.Type.Bool respectively.
source share