关于 haskell:Kind Demotion(相对于 Kind Promotion)

Kind Demotion (as opposed to Kind Promotion)

DataKinds 扩展将"值"(即构造函数)提升为类型。例如 TrueFalse 成为类型 Bool 的不同类型。

我想做的恰恰相反,即将类型降级为值。具有此签名的函数会很好:

1
demote :: Proxy (a :: t) -> t

我实际上可以这样做,例如 Bool:

1
2
3
4
5
6
7
8
class DemoteBool (a :: Bool) where
  demoteBool :: Proxy (a :: Bool) -> Bool

instance DemoteBool True where
  demoteBool _ = True

instance DemoteBool False where
  demoteBool _ = False

但是,我必须为我想降级到它的值的任何类型编写实例。有没有更好的方法来做这不涉及这么多样板?


这是singletons的用途之一,特别是fromSing:

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

它仍然涉及很多样板,但是包已经定义了很多,我相信它提供了 Template Haskell 让您更轻松地生成自己的模板(并且代码更少)。