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?
b :: Bool
you don't know for certain that it's eitherTrue
orFalse
. It could be a stuck type. A singleton proves that its type isn't stuck. Dependent Haskell will help a bit for this particular case, becauseTrue
and'True
will be the same thing, but there are still unavoidable problems with partiality. – DownstairsTypeInType
help at all here, or is that unrelated? – Empyreana :: !Bool
and use it in the code :) – Empyrean