Types Lambda演算中的类型推断

Types Lambda演算中的类型推断,types,lambda,calculus,inference,Types,Lambda,Calculus,Inference,我想知道,在lambda演算方面,特别是在类型推断方面,谁会有一些不错的资源。 我正在为考试而学习,在我所做的任何教程中,我似乎都找不到任何关于lambda类型以及如何推断的信息 我有一道考试题,我想在星期二把它弄清楚 在下面的lambda演算表达式中推断所有变量和带括号的子表达式的类型: (\表示λ) ((\x.(\y.(x,y)y))g)h) 我保证这不是家庭作业!非常欢迎提供任何帮助。推断lambda术语的类型(最通用、最简单)是一项非常简单且极具指导意义的活动。当您试图破译lambda术

我想知道,在lambda演算方面,特别是在类型推断方面,谁会有一些不错的资源。 我正在为考试而学习,在我所做的任何教程中,我似乎都找不到任何关于lambda类型以及如何推断的信息

我有一道考试题,我想在星期二把它弄清楚

在下面的lambda演算表达式中推断所有变量和带括号的子表达式的类型: (\表示λ)

((\x.(\y.(x,y)y))g)h)

我保证这不是家庭作业!非常欢迎提供任何帮助。

推断lambda术语的类型(最通用、最简单)是一项非常简单且极具指导意义的活动。当您试图破译lambda术语时,从猜测其类型开始是一个非常好的方法

类型推断背后的一般思想是,您开始将泛型类型(类型变量)归因于任何标识符,然后根据您在术语中对标识符的使用来细化此类型。这在lambda演算中非常容易,因为标识符只能以两种方式使用:作为函数的参数或作为函数

例如,在您的示例中,假设x:α和y:β。但是x应用于y, 因此,它必须有一个函数类型,而且它的输入必须与参数y的类型兼容,因此我们将α细化为(β->γ),其中γ是应用程序(xy)的(so fa未知)结果类型

术语(xy)依次应用于y。这意味着γ实际上也必须是一个函数类型,也就是说,γ=β->δ

在这种情况下,这基本上结束了分析

为了清楚起见,我在下面报告了所有子项的类型(请注意,所有应用程序都是正确类型的):

此外,我们还得出了g:β->β->γ和h:β的结论。 整个表达式为γ型

这个术语提供了一个稍微有趣的例子 \y、 \x.(y(yx))。 假设x:α。那么y必须有类型α->β,其中β是结果的类型(yx)。该项再次作为输入传递给y,这意味着α=β。 所以 \y、 \x.(y(yx)):(α->α)->α->α

通常,在某些情况下,当您对同一标识符有多个使用时,您需要统一它们的类型,从而推断出它们之间最通用的实例


关于Damas-Milner类型推理算法的讨论相当不错,但在我看来,对于这样一个简单直观的主题来说,这是非常技术性的。

假设使用简单类型的lambda演算?lambda演算有几种类型系统,有些甚至不允许类型推断。对不起,类型lambda演算。
  x               : β -> β -> γ
  y               : β
  (x y)           : β -> γ
  ((x y) y)       : γ
  \y.((x y) y)    : β -> γ
  \x.\y.((x y) y) : (β -> β -> γ) -> β -> γ