我想知道任何人都会在lambda演算上有一些不错的资源,特别是在类型推断方面。 我正在攻读考试,我似乎无法找到关于lambda类型的任何信息以及如何在我完成的任何教程中推断。
我有一个考试问题,我正试图让我的头脑周二...
在下面的lambda演算表达式中推断所有变量和带括号的子表达式的类型: (\表示lambda)
(((\ X。(\收率(X,Y)Y))克)H)
我保证这不是功课!任何帮助都会非常受欢迎。
答案 0 :(得分:0)
为lambda术语推断(最常见,简单)类型是一项非常简单且极具指导性的活动。当你试图破译一个lambda术语时,从猜测它的类型开始是一个非常好的方法。
类型推断背后的一般思想是,您开始将泛型类型(类型变量)归因于任何标识符,然后根据您对术语中标识符的使用来优化此类型。这在lambda演算中非常容易,因为标识符只能以两种方式使用:作为函数的参数或作为函数。
例如,在您的示例中,假设x:α和y:β。但x适用于y, 因此它必须具有函数类型,而且它的输入必须与参数y的类型兼容,因此我们将α细化为(β - >γ),其中γ是应用程序的(因此未知)结果类型(XY)。
术语(x y)又应用于y。这意味着γ实际上也必须是一种功能类型,即γ=β - >。 δ。
在这种情况下,这基本上是对分析的总结。
为了清楚起见,我在下面报告了所有子类型的类型(请注意,所有应用程序都输入得很好):
x : β -> β -> γ
y : β
(x y) : β -> γ
((x y) y) : γ
\y.((x y) y) : β -> γ
\x.\y.((x y) y) : (β -> β -> γ) -> β -> γ
另外,我们得出g:β - > β - > γ和h:β。 整个表达式有γ型。
该术语提供了一个稍微有趣的例子 \ y。\ x。(y(y x))。 假设x:α。然后y必须具有类型α - > β,其中β是结果的类型(y x)。该术语再次作为y的输入传递,这意味着α=β。 所以, \ y。\ x。(y(y x)):(α - >α) - > α - > α
通常,在某些情况下,当您多次使用同一个标识符时,您需要统一其类型,推断它们之间最常见的实例。
关于Damas-Milner类型推理算法的wikipage相当不错,但在我看来,对于这样一个简单直观的话题来说非常技术性。