The DataKinds extension promotes "values" (i.e. constructors) into types. For example True
and False
become distinct types of kind Bool
.
What I'd like to do is the opposite, i.e. demote types into values. A function with this signature would be fine:
demote :: Proxy (a :: t) -> t
I can actually do this, for example for Bool
:
class DemoteBool (a :: Bool) where
demoteBool :: Proxy (a :: Bool) -> Bool
instance DemoteBool True where
demoteBool _ = True
instance DemoteBool False where
demoteBool _ = False
However, I'd have to write up instances for any type I want to demote back to it's value. Is there a nicer way of doing this that doesn't involve so much boilerplate?