16

DataKinds拡張機能は、「値」(つまりコンストラクター) を型に昇格させますたとえば、TrueandFalseは 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

ただし、その値に降格したい型のインスタンスを作成する必要があります。ボイラープレートがそれほど多くない、これを行うためのより良い方法はありますか?

4

1 に答える 1

12

singletonsこれは、特にの用途の 1 つですfromSing

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

まだ多くの定型文が含まれていますが、パッケージには既に多くの定型文が定義されており、テンプレート Haskell を提供して、独自のコードをより簡単に (そしてより少ないコードで) 生成できるようになっていると思います。

于 2016-11-21T23:38:53.467 に答える