文章Simpler, Easier!声称即使没有“Pi”,也可以对依赖类型系统进行编码 - 也就是说,您可以为其重用“Lam”构造函数。但是,如果在某些情况下对“Pi”和“Lam”的处理方式不同,那又怎么可能呢?
此外,可以删除“明星”吗?我认为你可以用“λx.x”(id)替换所有出现的内容。
答案 0 :(得分:6)
这就像Haskell中的(a, b)
一样过载:它既可以是类型也可以是值。您可以对Π
和λ
使用相同的绑定器,并且typechecker将根据您的上下文决定您的意思。如果您将一个绑定器与另一个绑定器进行类型检查,则前者为λ
,后者为Π
- 这就是为什么您无法明确地将*
替换为λ x . x
- 因为那时以前的活页夹可能是Π
而后者是*
(*
作为活页夹对我没有任何意义)。 ∀ = λ
和* = λ x . x
存在一个更大的问题:传递性* = ∀ x . x
,这是假设False
的常见方式 - 此类型必须在声音系统中无人居住,所以你根本就没有任何类型。
Coq俱乐部最近有一个帖子“forall和fun之间的相似之处”(gmane.org给了我“没有这样的信息”,这只是我吗?),这里有一些摘录:
Dominic Mulligan :
这是另一个带有类似作品的小参考书目:
http://www.macs.hw.ac.uk/~fairouz/forest/papers/journals-publications/jfp05.pdf
具有讽刺意味的是,根据那篇论文,Coquand首先提出了微积分 遵循约定的具有单个统一绑定器的构造 由De Bruijn在AutoMath建立。
Thorsten Altenkirch:
一个函数及其类型是非常不同的概念,即使它们有 一些肤浅的句法相似性。
特别是对于新手而言,这种识别非常混乱 完全误导。我认为应该理解类型 理论概念来自它们的意思而不是它们的样子。
Andreas Abel :
我的学生Matthias Benkard也参与了这样一个系统,请参阅“Type 检查没有类型“
请注意,第一个链接中描述的系统具有Π减少(即您可以像lambdas一样应用pi类型) - 如果您统一Π
和λ
,您的系统也会拥有它内部(而不是语法上)。并且第二个链接中描述的系统统一了类型和值
一个直接后果是两者之间没有任何区别 类型及其居民:每个值都是包含自身的类型 及其所有部分;相反,每种类型都是复合值 由居民组成。
所以实际上只有一个活页夹(let
和fix
除外)。