亲切降级(与善意促销相对)

时间:2016-11-21 22:01:04

标签: haskell higher-kinded-types data-kinds

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 个答案:

答案 0 :(得分:11)

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

[1, 2, 3]

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