存在类型的理论基础是什么?
该哈斯克尔维基做了解释如何使用存在类型的一个很好的工作,但我不太神交背后的理论。 考虑以下存在类型的示例: data S = forall a. Show a => S a -- (1) 为我们可以转换为的东西定义类型包装String。维基提到我们真正想要定义的是类似 data S = S (exists a. Show a => a) -- (2) 即真正的“存在”类型-S大概我认为这是“数据构造函数接受Show实例存在的任何类型并将其包装”。实际上,您可能会编写如下的GADT: data S where -- (3) S :: Show a => a -> S 我没有尝试编译它,但是似乎它应该可以工作。对我来说,GADT显然等效于我们要编写的代码(2)。 但是,对我来说,为什么(1)等同于(2)并不清楚。为什么将数据构造函数移到外部会forall变成exists? 我能想到的最接近的是逻辑上的德摩根定律,在其中交换否定词和量词的顺序会将存在量词变成通用量词,反之亦然: ¬(∀x. px) ⇔ ∃x. ¬(px) 但是数据构造函数似乎与否定运算符完全不同。 …