2016-11-21 19 views
12

DataKinds拡張子は「値」(つまりコンストラクタ)を型に昇格します。たとえば、TrueFalseは、種類が異なる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 

しかし、私は私がしたい任意の型のインスタンスを記述する必要があると思いますその価値に降格する。これほど多くの定型文が含まれていない、これを行うためのより良い方法がありますか?

+1

手動で行う必要がある理由は、偏重です。タイプレベルの 'b :: Bool'が与えられていると、それは' True'か 'False'のどちらかであることが分かりません。それは[スタック型](https://typesandkinds.wordpress.com/2015/09/09/what-are-type-families/)である可能性があります。シングルトンは、型がスタックしていないことを証明します。 「True」と「True」は同じものですが、依然として偏見には避けられない問題が存在するため、Dependent Haskellはこの特定のケースでは少し助けになります。 –

+0

@BenjaminHodgsonは既存の 'TypeInType'ヘルプをここでやっていますか、それとも無関係ですか? – porges

+0

厳しいフィールドにはボトムを含めることができないように、持ち上げたときに厳しいフィールドにスタック型が含まれていないと楽しいでしょう。私は 'a ::!Bool'をスコープしてコード内で使用できるようにしたいだけです:) – porges

答えて

10

fromSing特に、singletonsの用途の一つである:

ghci> :m +Data.Singletons.Prelude 
ghci> :set -XDataKinds 
ghci> fromSing (sing :: Sing 'True) 
True 

それはまだ定型の多くを含むが、パッケージは、それの多くは、すでに定義されていると私はそれがテンプレートHaskellの提供と信じてより簡単に(そして少ないコードで)自分自身を生成させることができます。