DataKinds拡張機能は、「値」(つまりコンストラクター) を型に昇格させます。たとえば、True
andFalse
は kind の異なる型になりますBool
。
私がやりたいことは反対です。つまり、型を値に降格させます。このシグネチャを持つ関数は問題ありません。
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
ただし、その値に降格したい型のインスタンスを作成する必要があります。ボイラープレートがそれほど多くない、これを行うためのより良い方法はありますか?