Tag: 存在型

Haskell中的存在与量化types

这些差别究竟是什么? 我想我明白存在types是如何工作的,他们就像在OO中有一个基类,没有下滑的方法。 普遍types如何不同?

存在types的理论基础是什么?

Haskell维基解释如何使用存在types做了很好的工作,但是我不太理解它背后的理论。 考虑这个存在types的例子: data S = forall a. Show a => S a — (1) 为我们可以转换为String东西定义一个types包装器。 维基提到,我们真正想要定义的是类似的 data S = S (exists a. Show a => a) — (2) 即一个真正的“存在”types – 松散的我认为这是说“数据构造函数S采取任何types的Show实例存在和包装它”。 实际上,你可以写一个GADT,如下所示: data S where — (3) S :: Show a => a -> S 我没有尝试编译,但似乎它应该工作。 对我来说,GADT显然等同于我们想写的代码(2)。 然而,我完全不明白为什么(1)等同于(2)。 为什么把数据构造函数移到外面会把所有的东西变成exists ? 我能想到的最接近的是德摩根的逻辑规律 ,交换否定顺序和量词将存在量词转换为通用量词,反之亦然: ¬(∀x. px) ⇔ […]

什么是存在型?

我通读维基百科文章存在的types 。 由于存在操作符(∃),我认为它们被称为存在types(existential types)。 不过,我不确定它的意义。 有什么区别 T = ∃X { X a; int f(X); } 和 T = ∀x { X a; int f(X); } ?