【Programming Languages And Lambda calculi】第四章 Lambda演算 / Lambda表达式 4.1 演算中的函数 柯里化

第四章 Lambda演算 / Lambda表达式

B语言的限制性太强,对任何实际的编程任务都用处不大。因为它没有抽象能力,也就是说,没有定义功能的能力,这使它远不如现实的编程语言。

在这个章节,我们将会学习一种叫做 Lambda演算 的语言,它由Church发明。尽管 Lambda演算的语法和规约关系很小,但它与Scheme和ML等十分有用的语言密切相关。在这些语言中,函数不仅操纵布尔、整数和对,也操纵其他函数。换句话说,函数就是值。例如,map函数使用函数和元素列表,并应用函数应用列表中的每个元素。类似的,求导函数会在实数上应用一个函数并返回一个实现其求导的新函数。

在Lambda演算中,值唯一的类型为函数,但是我们将看到其他类型的值(包括布尔值、整数和对)如何用函数来定义。

Lambda演算中的函数

Lambda演算的规则提供了一种简单、正规的方法去为应用实现函数,并且同时也作为其他函数的输入输出。这样的函数的规则让Lambda演算集中在从参数到结果的规约中,并且忽略了为函数命名、函数的域及函数的范围。例如,当一个数学家在某个集合中指定了一个恒等函数:
∀ x ∈ A , f ( x ) = x \forall x \in A,f(x) = x xA,f(x)=x
或是:
f : { A ⟶ A x ↦ x f:\left\{ \begin{aligned} A &\longrightarrow A \\ x &\mapsto x \\ \end{aligned} \right. f:{ AxAx
在Lambda演算的规则里,我们写为:
( λ x . x ) (\lambda x.x) (λx.x)
这个表达式的正确说法为:“如果参数被称为 x ,则函数的输出为 x。”换言之,该函数输出其接受到的输入值。

如果要写下函数 f 对参数 a 的应用,Lambda演算使用原始数学语法,对括号放置的位置进行取模。
( f   a ) (f \ a) (f a)
比如,表示恒等函数对a进行应用的表达式为:
( ( λ x . x )   a ) ((\lambda x.x)\ a) ((λx.x) a)
另一种可能作为恒等函数的参数是这个恒等函数自己:
( ( λ x . x )   ( λ x . x ) ) ((\lambda x.x)\ (\lambda x.x)) ((λx.x) (λx.x))
下述表达式表示一个函数接收一个参数,无视,返回恒等函数:
( λ y . ( λ x . x ) ) (\lambda y.(\lambda x.x)) (λy.(λx.x))
下述表达式表示一个函数接收一个参数,返回一个函数,返回的函数无视其自己的参数,返回原始函数的参数:
( λ y . ( λ x . y ) ) (\lambda y.(\lambda x.y)) (λy.(λx.y))
Lambda演算只支持单参数函数,但是最后的例子证明了一个函数如何有效地接收两个参数,x 和 y,先处理第一个参数,然后返回另一个函数并取得第二个参数。这个技巧被称作 柯里化

传统的数学表示中,f(a) 可以通过“把表达式作为f的定义,并用 f 的形参替换成 a ”的方式简化。比如,给定 f(x) = x,f(a) 可以简化为 a。Lambda演算的简化是相似的:((λx.x) a) 可以简化为 a,方法同样是将函数体部分(点后面),将实际参数代替所有形参(点之前的部分)。

下面为一些例子:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ &((\lambda x.x…

猜你喜欢

转载自blog.csdn.net/qq_35714301/article/details/113804433
今日推荐