Lambda 项可以是:
- 多变的
- lambda 抽象(例如
\x.t
) - 应用。如果
t
和s
是lambda 项,那么ts
是一个应用程序。
因此,在左侧(例如(\x.t)a
)具有抽象的应用程序看起来不错。它看起来像函数调用。但是当左侧部分是变量或其他应用程序时,应用程序意味着什么?是什么意思ab
,((\x.x)a)b
或者a(\x.x)
如果a
和b
是变量?
((\x.x)b)c
是一个功能应用程序。这里适用b
于c
。
((\x.x)b)c
= bc
a(\x.y)
是一个函数应用程序,将函数a
应用于它的唯一参数,它恰好是一个函数,即返回的函数y
(一个自由变量)。
lamdba 演算的特点之一是可以轻松地将函数应用于函数,并且函数可以将其他函数作为参数。你的两个例子很好地展示了这两种情况。
编辑有(至少)两个版本的 lambda 演算:无类型和有类型。在您在这里使用的无类型演算中,任何东西都可以应用于任何东西。在类型化演算中存在不是函数的基本类型,例如命题类型和“个体”类型。所以你只能写ab
如果类型a
是一个函数类型,将类型映射b
到某个东西。