第 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)
cube 示意图

在盒子 var 里,我们放进 10;在盒子 (cube x) 里,我们放进 (* x x x)。一个盒子里装的是数字,另一个盒子里装的是表达式。是不是很像?那么,如果往盒子里放的既不是基本的值、也不是表达式,而是一个函数,又会怎样呢?简直不可思议!

它大概会是这个样子:

(define f [some function])

其中 [some function](某个函数)就是我们要放入 λ表达式 的位置。继续读下去,你会了解到更多!