Расширение DataKinds поддерживает "значения" (т.е. конструкторы) в типы. Например, True
и False
становятся разными типами вида Bool
.
То, что я хотел бы сделать, это наоборот, т.е. типы demote в значения. Функция с этой сигнатурой будет в порядке:
demote :: Proxy (a :: t) -> t
Я действительно могу это сделать, например, для Bool
:
class DemoteBool (a :: Bool) where
demoteBool :: Proxy (a :: Bool) -> Bool
instance DemoteBool True where
demoteBool _ = True
instance DemoteBool False where
demoteBool _ = False
Однако мне придется писать экземпляры для любого типа, я хочу понизить его ценность. Есть ли более хороший способ сделать это, что не связано с большим количеством шаблонов?