12
DataKinds拡張子は「値」(つまりコンストラクタ)を型に昇格します。たとえば、True
とFalse
は、種類が異なる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
しかし、私は私がしたい任意の型のインスタンスを記述する必要があると思いますその価値に降格する。これほど多くの定型文が含まれていない、これを行うためのより良い方法がありますか?
手動で行う必要がある理由は、偏重です。タイプレベルの 'b :: Bool'が与えられていると、それは' True'か 'False'のどちらかであることが分かりません。それは[スタック型](https://typesandkinds.wordpress.com/2015/09/09/what-are-type-families/)である可能性があります。シングルトンは、型がスタックしていないことを証明します。 「True」と「True」は同じものですが、依然として偏見には避けられない問題が存在するため、Dependent Haskellはこの特定のケースでは少し助けになります。 –
@BenjaminHodgsonは既存の 'TypeInType'ヘルプをここでやっていますか、それとも無関係ですか? – porges
厳しいフィールドにはボトムを含めることができないように、持ち上げたときに厳しいフィールドにスタック型が含まれていないと楽しいでしょう。私は 'a ::!Bool'をスコープしてコード内で使用できるようにしたいだけです:) – porges