Answers:
记住(或有时会看到的)是一种类型。概括。因此,虽然说是很有意义的,但说却没有任何意义,因为只是一种类型。你不会说 becaues不是为每本身计算,它的存在对可应用于这样的分类lambda项。Π →交通(λ X :甲。中号)ñ (∀ X :甲。中号)ñ ∀ 。。。(A → B )N →
这也是令我震惊的事情,但这就是构造演算(以及任何其他依赖类型的系统的定义)的方式。
您编写的两个程序的意图完全不同,第一个程序的类型错误。说是没有意义的,因为需要按类型同时使用两个参数,这意味着如果要被正确键入,我们必须有。但是,不是类型,只能将其指定为,永远不会。另一方面,第二个几乎是(我想您要返回 not)是一个函数,并使用两个赋予类型。∀ ∀ X :一。乙乙:* λ X 。X ∀ X :一。B *X ∀
请记住,存在性类型和通用类型非常不同。它是构造逻辑,不是古典逻辑,在构造逻辑和∃中不像在古典逻辑中那样重要。
是程序的类型,程序接收类型 A的对象并返回类型 B (x )的对象。这里最重要的是,该类型乙(X )依赖于 X,不都是一样的 X。它可以取决于 x是什么。对于一个输入 x,我们可能输出一个整数。对于另一个,我们可能输出一个实数。对于另一项,我们可能会输出一个实数函数。如果 B (x ) 不会随变化而变化,那么您可以在适当的位置使用A → B,这是从A到B的函数类型。
是(建设性)析取的从属版本。你能想到的建设性脱节的一个∨ 乙两类一和乙为的不交一个和乙。 ∃ X :甲。B (x )是 由 x :A索引的 B (x )类型集合的不相交联合。B型( van取决于 x的值:A 使它成为从属类型。与案件比较,其中乙不依赖于 X :一: ∃ X :一。乙。我们为每个 x取一个相同 B的副本:A。这与 A × B同构。
现在您可以问为什么我们需要依赖的乘积和总和类型?因为它们赋予我们更多表现力。现在我们可以完全忽略类型,并拥有无类型的类型理论/函数式编程。但这消除了首先拥有类型的好处,例如,您将不知道所有程序是否总是会终止(强规范化)。请参阅Lambda多维数据集和 相关类型。我认为,很好地理解从属类型的一种好方法是查看Martin-Lof类型理论中引入和消除从属类型的规则。
依赖类型的要点是:由于各种原因(例如避免错误,自动终止证明等),我们希望保留在良好的类型理论中。我们不想去像未类型化的lambda演算之类的东西,我们可以像您所说的那样进行表达,并提供更强大的功能。可以说,从属类型的发明是为了允许表达更多的东西,同时仍然保留在好的类型理论之内。