将(通过 DataKinds)提升到 * -> A 的构造函数

Constructor that lifts (via DataKinds) to * -> A

给定一个像

这样的 ADT
data K = A | B Bool

DataKinds 扩展允许我们将其提升为种类和 types/type 构造函数

K :: BOX
'A :: K
'B :: 'Bool -> K

有没有办法将构造函数添加到 K 提升到类型构造函数

'C :: * -> K

?

目前,恐怕还没有。我也没有发现明显的解决方法。

This ticket 记录了声明数据类型的前景,天生的类型,而不是强加于它们的数据类型。此类事物的构造函数按照您的建议打包类型是完全合理的。我们还没有到那一步,但看起来问题不大。

我的目光投向了更大的奖赏。我希望 * 成为完全合理的运行时值类型,以便您想要的类型可以像我们今天拥有的那样通过提升而存在。将其与提出的 pi-type 概念(对类型和值有效共享的语言部分的非参数抽象)相结合,我们可能会得到比我们拥有的更直接的方法来进行临时类型抽象Data.Typeable。通常的 forall 将保持参数化。

正如康纳所说,这不可能直接实现。但是,您可以定义

data K a = ... | C a

那么这个提升为

C :: a -> K a

如果你再使用K *,你就可以达到你想要的效果。