2.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 演算中,称为函数的应用,application),把参数写在函数的后面。当用参数值调用函数时,只是简单地用参数的值(这里 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 演算,但现在我们要把注意力转回现实世界。我们要讨论的第一组概念,是有关在函数程序中的数据表示,这些概念对程序处理数据有重大影响。

2.1 函数编程的基础

时间: 2024-10-26 22:17:36

2.1 函数编程的基础的相关文章

有用函数编程

<序> 感谢 关于本书 关于封面 第一部分 学习函数式思维 第一章 不同的思维 1.1 什么是函数式编程? 1.2 通往有用函数编程之路 1.3 用函数式编程提高生产力 1.3.1 函数范式 1.3.2 声明式编程风格 1.3.3 了解程序的执行 1.3.4 设计并发友好的应用程序 1.3.5 函数风格怎样形成代码 1.4 函数式编程演示样例 1.4.1 用声明式风格表达意图 1.4.1.1 用 LINQ 处理数据 1.4.1.2 用 XAML 描写叙述用户界面 1.4.1.3 声明式函数动画

小猿圈平台如何带小白学习python入门视频教程

Python开发技术近年来非常火热,尤其是在一线城市对于python开发人才需求一直扩大.很多企业对于python开发技术人才不惜重金招募.所以学习Python技术的人越来越多,初学Python开发技术的小伙伴对Python不是很了解,不知道Python技术好不好学,更不知道自己能否学好Python开发,本篇文章小编就和大家分享一下小猿圈平台如何带小白学习python入门视频教程? 小猿圈平台如何带小白学习python入门视频教程: 我们先来了解一下Python的学习路线,Python入门课程第

java web 开发三剑客 -------电子书

Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知Internet的目的是让各个net交互.所以,Internet实质上是将世界上各个国家.各个网络运营商的多个网络相互连接构成的一个全球范围内的统一网,使各个网络之间能够相互到达.各个国家和运营商构建网络采用的底层技术和实现可能各不相同,但只要采用统一的上层协议(TCP/IP)就可以通过Internet

python3 速查参考- python基础 -&gt; 函数编程之 装饰器、生成器

装饰器 1.速查笔记 #-- 函数装饰器:是它后边的函数的运行时的声明 由@符号以及后边紧跟的"元函数"(metafunction)组成 @staticmethod def smeth(x): print(x) # 等同于: def smeth(x): print(x) smeth = staticmethod(smeth) 定义:在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator) 经典示例: # -*- coding:utf-8 -*- import time

JavaScript函数编程-Ramdajs

在JavaScript语言世界,函数是第一等公民.JavaScript函数是继承自Function的对象,函数能作另一个函数的参数或者返回值使用,这便形成了我们常说的高阶函数(或称函数对象).这就构成函数编程的第一要素.在JavaScript世界中有很多的函数式编程库能辅助我们的JavaScript函数式体验,在它们之中最为成功的要数Underscore或lodash. 如下lodash实例代码: var users = [ { 'user': 'barney', 'age': 36 }, {

python基础-第七篇-7.2面向对象(进阶篇)

进入到今天的探索前,我先对上节内容进行一下回顾: 面向对象是一种编程方式,此编程方式的实现是基于对类和对象的使用 类是一个模板,模板中包装了多个函数可供使用 对象是基于类创建的,实例用于调用被包装在类中的函数 对于c#和java--只能用面向对象编程,而对于ruby和python则可以用函数编程和面向对象编程 面向对象不是所有的情况都适用,当两个东西不存在公共的部分,最好用函数编程 对象编程里的self是形式参数,是python内部把对象当参数传递进去的 __init__  构造方法--当实例化

PYDay14:反射、面向对象基础-封装、集成、多态

1.反射 通过字符串的形式,导入模块再通过字符串的形式,去模块中寻找指定的函数并执行eg:__import__(模块) 更加字符串的形式去对象(某个模块)中操作其成员 常用方法: getattr() hasattr() setattr() delattr() 扩展: r = __import__('www.iclinux.com',fromlist=True) 反射示例: 使用反射,无需依照函数的数量来写判断了 2.面向对象基础: C# Java 只能使用面向对象编程 Pyhon Ruby:即可

Day6 - Python基础6 面向对象编程

Python之路,Day6 - 面向对象学习 本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是人, 一个是狗,且人和狗都有不同的技能,比如人拿棍打狗, 狗可以咬人,怎么描述这种不同的角色和他们的功能呢? 你搜罗了自己掌握的所有技能,写出了下面的代码来描述这两个角色 1 2 3 4 5 6 7 8 9 10 11

python面向对象基础

面向对象基础 1. 简述 编程方式: 面向过程: 根据代码在脚本的堆叠顺序,从上到下依次执行 函数式编程:将相同功能的代码封装到函数中,直接调用即可,减少代码重复性 面向对象:对函数进行分类和封装,将同类的函数放到一个类中,使调用更简单 为嘛要面向对象 应用需求 要的对系统的cpu.内存.硬盘等进行监控,超过阈值则告警 while True:    if cpu利用率 > 90%:        #发送邮件提醒        连接邮箱服务器        发送邮件        关闭连接