2.1 的函数编程的基础

现实世界的函数编程:有 F# 和 C# 示例 1-02-01

2.1 的函数编程的基础

    回顾一下第 1 章,lambda 演算起源于上世纪 30 年代的数学理论。如今,它是计算机科学理论的重要组成部分,在逻辑上,它用于协助证明及验证系统的工具 (例如,在 CPU 设计),它也被用作一种简单的正式编程语言,可以帮助准确解释其他语言的行为。

    注意

    在下一节中,我们将向你展示几个以 lambda 演算编写的示例“程序”,这些程序展示很多概念纯洁和干净的形式,我们将在本章后面看到。在 lambda 演算中,整个的“程序”是一个表达式(2.2.4 节),函数可以将其他函数作为参数(2.3.2 节)。几页以后,我们将回到这些真正的编程语言下的概念。

    我们已经包括了这个背景材料,因为它演示了一些概念,以他们最纯净的形式。我希望你会发现它像我们做的一样有趣——但对于理解本书的其余部分,这并不是必需的。

    当 Alonzo Church 在 1932 年引入了 lambda 演算时,他试图使每个数学构造形式化,使用的最基本的数学概念、函数的。当你编写的数学函数(称之为 f),把任何的给定参数加 10,可以写成:

f(x) = x + 10

    Church 想到处使用函数。事实上,在他的形式化中的一切都是函数。给每个函数分配名称是不切实际的,因为当一切都是写成函数,许多函数都只能使用一次,他引入了一个符号,允许写出的函数的不需要名称:

(λx.x + 10)

    这个表达式表示一个函数,只有一个参数,用希腊字母 lambda 后跟变量名称(这里,x)表示。参数的声明,是后面跟一个点,和函数体(这里,x + 10)。在纯 lambda 演算中,数字(例如,10)、数学运算符(例如 +)都用函数定义,所以,除了函数以外,什么也没有,这个定义很令人吃惊。为使事情简单,我们将使用标准的数字和运算符。让我们继续我们的示例函数,说我们要把 32 设置为参数,结果将是:

(λx.x + 10) 32 = 32 + 10 = 42

    把参数代入函数(在 lambda 演算中,这称为函数的应用),把参数写在函数的后面。当用参数值调用函数时,只是简单地用 参数的值(这里 32),替换所有的变量(这里,x)。这就是这个表达式,它跟着第一个等号。如果我们把 + 看作为内置函数,它将在下一步被调用,产生 42 作为结果。

    关于 lambda 计算最有趣的方面——函数编程语言的基石——是任何功能可以把一个函数作为参数。这意味着我们可以写一个函数,取一个函数(二元运算符)和一个值作为参数,然后调用这个二元运算符,用这个值作为两个参数:

(λop.λx.(op x x))

    正如你所看到的,我们写了一个函数,把 op 和 x 作为参数。编写的函数具有多个参数时,我们多次使用 lambda 符号,声明更多的参数。在 lambda 函数体中,我们将使用 op 来表示一个函数,用 x 表示给 op 函数的第一和第二个参数。如果我们把 + 运算符作为第一个参数,21 为第二个参数,让我们看看代码怎么做:

(λop.λx.(op x x)) (+) 21 = (λx.((+) x x)) 21 = (+) 21 21 = 42

    具有多个参数的函数,函数将第一个参数(这里,op)代入,并返回 lambda 表达式,就就成了另一个函数。这意味着在第一步,我们应用这个函数(把 op 作为参数)给这个参数 (+),这样产生的结果是,在第一个等号后, op 变量被替换为 (+)。结果仍是代参数的函数,所以我们可以继续这个过程。下一步在这个函数中,把 21 作为参数 x 的值代入,结果是表达式 (+) 21 21,这是两个数字加法的另一种表示。与 21 + 21 的意思相同,因此计算的最后结果是 42。正如你所看到的,在 lambda 演算中,计算一直继续,直到没有函数的应用(函数后跟着它的参数),就可计算结果了。

    Lambda 演算的有趣来自理论的视角,或函数思想来自哪里,但现在让我们把注意力转回现实世界。我们将谈论的第一组概念,是有关在函数程序中的数据表示,这些概念程序如何处理数据有重大影响。

你可能感兴趣的:(F#,职场,C#,休闲,函数编程)