Kind Demotion (as opposed to Kind Promotion)
DataKinds 扩展将"值"(即构造函数)提升为类型。例如 True 和 False 成为类型 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 |
但是,我必须为我想降级到它的值的任何类型编写实例。有没有更好的方法来做这不涉及这么多样板?
- 您必须手动执行此操作的原因是偏心。给定一个类型级别的 b :: Bool,您不确定它是 True 还是 False。它可能是卡住类型。单例证明它的类型没有被卡住。 Dependent Haskell 对这种特殊情况会有所帮助,因为 True 和 'True 将是同一件事,但仍然存在不可避免的偏心问题。
-
@BenjaminHodgson 现有的 TypeInType 在这里有帮助吗,还是不相关?
-
如果提升时的严格字段不能包含卡住类型会很有趣,就像严格字段不能包含底部一样。我只是希望能够覆盖 a :: !Bool 并在代码中使用它:)
这是singletons的用途之一,特别是fromSing:
1 2 3 4
| ghci > :m +Data.Singletons. Prelude
ghci > :set -XDataKinds
ghci > fromSing (sing :: Sing 'True )
True |
它仍然涉及很多样板,但是包已经定义了很多,我相信它提供了 Template Haskell 让您更轻松地生成自己的模板(并且代码更少)。