通用类型是存在类型的子类型还是特例?


20

我想知道一个普遍-量化类型是否Ť 一个 = X { 一个X ˚F X { Ť ˚F } }是一个存在限定的一个子类型,或特殊情况下,键入Ť Ë具有相同签名:Ť è = X { 一个X ˚F X { Ť ˚F } }Ta

Ta=X:{aX,f:X{T,F}}
Te
Te=X:{aX,f:X{T,F}}

我会说“是”:如果事情是真实的“对所有X”()的话,那也必须是真实的“对一些X”(X)。也就是说,“声明 ”仅仅是与“相同的说法更受限制的版本 ”: X P X XX

X,P(X)?X,P(X).

我在某个地方错了吗?

背景:为什么我要问这个?

我正在研究存在类型,以了解“抽象[数据]类型具有存在类型”的原因和方式。单凭理论我无法很好地理解这个概念。我也需要具体的例子。

不幸的是,很难找到好的代码示例,因为大多数编程语言仅对存在类型提供有限的支持。(例如,HaskellforallJava的?通配符。)另一方面,许多最近的语言通过“泛型”支持通用量化的类型。

更糟糕的是,泛型似乎也很容易与存在类型混为一谈,这使得区分存在类型与通用类型变得更加困难。我很好奇为什么这种混淆如此容易发生。这个问题的答案可能可以解释这一点:如果通用类型确实只是存在类型的特殊情况,那么也就不足为奇了,通用类型(例如Java)List<T>可以用任何一种方式进行解释。


1
普遍和存在之间有什么区别?

从数学上讲,你是正确的:如果forall x. P(x)然后exists x. P(x)。检查类型时类型系统是否考虑到了这一点...我不知道。+1是一个有趣的问题。

1
@deinan:如果P(x)对任何x不成立,那么肯定 ∀xP(x)不成立。当没有什么,你可能是指为X,即∀x∈XP(X)并不意味着∃x∈XP(X)如果X =∅

1
...而且请注意,如果不使用设置符号来重写它们,它们的外观将有所不同:∀xx∈X⇒P(x).xx∈X&P(x)以及andxx∈X⇒P(x)会被任何有微弱满足X从不X

1
很酷的问题。在Haskell中,确实可以将类型的值(forall b。Show b => b)传递给采用a(forall b。b)的函数,但反之则不行,这意味着您希望从中获得可替换性子类型关系。但是,当然,当您谈论类型时,您应该提到您要查看的类型系统,尤其是如果您考虑到语义的形式类型代数...

Answers:


10

x:T,P(x)x:T,P(x)T

(x:T,P(x))(x:T,P(x))TaTe

Ta=X.{a:X,f:Xbool}AA(M)M:XM1M2XA(M1)A(M2)Ta

Te=X.{a:X,f:Xbool}BTeN:Xπ1(B)=Nπ2(B)={a:N,f:Nbool}N

不要被Haskell的误导forall:尽管它的名字,它是一种存在量词。

对于背景,我强烈建议类型和编程语言(第23和24章分别讨论通用类型和存在类型)。这将为理解研究文章提供有用的背景。


1
Haskell forall的确是一个次要的但很晚的怪癖,在隐式量化的原始上下文中,Haskell 的确是一个通用量词,即隐式量化的原始上下文,即从顶级“外部”查看多态类型。在这种定义的“内部”,当处理参数时,多态类型实际上是存在的。每个类型变量都绑定到某种类型,但是我们不知道(也不知道)该类型是什么。据我所知,尚无Haskell实现支持真正的(原始的,顶级的)存在类型,而且我还不清楚该实现什么目的。
CA McCann 2012年

1
GHC支持的存在类型是(直接或间接)具有通用量词的类型,从“外部”看,它们位于互变位置。这使用了与逻辑否定大致相同的对偶性,因此,为了在顶层具有这样的存在类型,必须使用类似CPS的编码将它们双重加倍(这是Uday Reddy给出的等效性)。请注意,出于相似的原因,直觉主义中的存在量词也会带来类似的不便。
CA McCann 2012年

5

X.P(X)X.P(X)

X.(X×(XBool))XX.(X×(XBool))

 f (p: \forall X. (X * (X -> Bool))) = PACK X = Bool WITH p[Bool]

您提到的关于存在性类型的文章有点理论化。Cardelli和Wegner的文章是更多教程文章:关于理解类型,数据抽象和多态性。有关编程语言的大多数高级教科书也将对存在类型进行一些讨论。Mitchell的《编程语言基础》是一本好书。

正确的是,大多数编程语言都没有显式的存在类型。但是,许多确实具有抽象类型(或使用其他名称,例如“包”或“模块”)。因此,即使它们不将这些值视为一等实体,它们也能够表达存在类型的值。

X.P(X)Y.(X.P(X)Y)Y

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.