It can be useful (especially with @PolyKinds@) to get the
\"bare\" type (e.g. @Either@) of some parameterized type
(e.g. @Either Char Int@). This library provides closed
classes that can strip and reapply type arguments, as well
as useful utility functions. Here are some examples:
Force @Left 1@ to be of type @Either Float a@ using a
partially-applied 'Proxy'.
>>> let t = (Left 1) `asApplied` (Proxy :: Proxy (Either Float))
>>> :t t
t :: Either Float a
Do the same, but illustrating type application with @ap@
>>> let t0 = (Left 1) `asApplied` ((Proxy :: Proxy Either) `ap` (Proxy :: Proxy Float))
>>> :t t0
t0 :: Either Float a
Force polymorphic @undefined@ to some polymorphic @Either@
type, the base type of @t@ defined above.
>>> let u = undefined `asApplied` (unappliedOf t)
>>> :t u
u :: Either a a1