第 2 课 导言
CS61AS 第 2 课导言:介绍 λ表达式 与高阶函数,为后续学习做准备。
引言
“I lambda Racket”(谐音 “I love Racket”)
本周我们将学习一个新的特殊形式(special form)lambda,它可以用来创建过程(procedure)!一定要把它学扎实,因为在本课程余下的内容中,它会频繁登场。
前置要求与课程内容
前置要求: 学习本课之前必须先完成第 1 课。你应当熟悉函数(function)、过程(procedure)以及过程调用等概念。
课程内容: 在本课中,我们将:
- 讲解 λ表达式(lambda)和高阶函数(higher-order function)
- 学习 Racket——以及任何以函数为导向的编程语言——的一个基本概念:用函数来操作函数
阅读材料
本课的相关阅读材料如下:
内容预览
在第 1 课中,我们学习了如何创建、修改和调用过程。每个过程都有自己的名字、实参(argument),以及主体(body)——我们在主体中告诉函数该怎样处理它的参数。
举个例子,下面这个过程 cube 接受一个实参 x,返回 x 的立方:
(define (cube x)
(* x x x))
我们用 define 定义了一个过程,它的名字是 cube,参数是 x,主体是 (* x x x)。到现在你应该已经能看出,主体把三个 x 乘在一起,返回 x 的立方。
cube 是一个过程,或者说一种抽象(abstraction)。我们可以像对待盒子一样把它拿在手里、传来传去,就像对待其他数字或符号一样。它有值(value),我们也可以给它起名字(name)。
现在仔细想想,上面那样定义 cube,与像下面这样定义 var 其实没有多大差别:
(define var 10)
在盒子 var 里,我们放进 10;在盒子 (cube x) 里,我们放进 (* x x x)。一个盒子里装的是数字,另一个盒子里装的是表达式。是不是很像?那么,如果往盒子里放的既不是基本的值、也不是表达式,而是一个函数,又会怎样呢?简直不可思议!
它大概会是这个样子:
(define f [some function])
其中 [some function](某个函数)就是我们要放入 λ表达式 的位置。继续读下去,你会了解到更多!