我一直试图理解应用的lambda演算。到目前为止,我已经理解了类型推断是如何工作的。但是,我无法理解说一个术语类型好或类型错误的含义,然后我如何确定某个术语是好类型还是错误类型。
例如,考虑定义为tw
的lambda术语λx[(x x)]
。如何判断它是一个好的或不好的术语?
答案 0 :(得分:0)
如果我们讨论Simply Typed Lambda Calculus一些额外的常量和基本类型(即应用的lambda演算),那么术语λx:σ. (x x)
形式良好,但是类型错误。
'格式良好的'意味着语法正确,即STLC的解析器可以接受。 ' Ill-typed '表示类型检查器不会进一步传递它。 类型检查器根据typing rules工作,它通常表示为一些打字判断(每种句法形式的一种打字方案)。
让我说明你提供的这个词确实是错误的。
根据规则(3)[请参阅输入规则链接],λx:σ. (x x)
必须具有通用格式σ -> τ
的类型(因为 是一个函数,或者更正确的抽象) 。但这意味着正文(x x)
必须具有某种类型τ
(假设为x : σ
)。这基本上与用自然语言表达的规则(3)相同。所以,现在我们需要弄清楚函数体的类型,它是一个应用程序。
现在,应用程序规则(4)说如果我们有一个像(e1 e2)
这样的表达式,那么e1
必须是某个函数e1 : α -> β
,而e2 : α
必须是正确类型的论证。让我们将此规则应用于我们的身体(x x)
的表达式。 (1)x : α -> β
和(2)x : α
。由于STLC中的术语只能有一种类型,因此我们得到了一个等式:α -> β = α
。
但是我们无法将两种类型统一起来,因为α
是α -> β
的子部分。这就是为什么这不会出现问题。
顺便说一句,STLC的一个主要观点是禁止自我应用(如(x x)
),因为它阻止使用(无类型)lambda演算作为逻辑,因为可以执行非终止使用自我应用程序进行计算(参见例如Y-combinator)。