良好的类型和病态的lambda术语

时间:2016-04-19 13:41:11

标签: type-inference lambda-calculus

我一直试图理解应用的lambda演算。到目前为止,我已经理解了类型推断是如何工作的。但是,我无法理解说一个术语类型好或类型错误的含义,然后我如何确定某个术语是好类型还是错误类型。 例如,考虑定义为tw的lambda术语λx[(x x)]。如何判断它是一个好的或不好的术语?

1 个答案:

答案 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)。