高阶函数的介绍
高阶函数的英文名称是Higher Order Function,它们是以函数为参数的函数。主要用于映射(mapping)、过滤(filtering)、归档(folding)和排序(sorting)表。高阶函数让程序更具模块性,让函数更加通用。
函数sort具有2个参数,一个是需要排序的表,另一个是定序(Ordering)函数。下面展示了按照大小将一个整数表正序排序。而<函数就是本例中函数的定序函数。
(sort‘(420 -130 138 983 0298 783 -783) <)
;Value:(-783 -130 0 138 298 420 783 983)
通过灵活使用定序函数,我们可以写出更强大的函数。
(sort‘(783 298 -289 429 892479 -197)
(lambda(x y) (< (modulo x 100)(modulo y 100))))
;Value:(-197 -289 429 479 783 492 892 298)
我们之前讲过,modulo函数用来求余。
Scheme并不区别过程和其他的数据结构,因此你可以通过将函数当作参数传递轻松的定义自己的高阶函数。而且Scheme并没有定义块结构的语法,因此使用lambda表达式作为一个块。
映射
映射是将同样的行为应用于表所有元素的过程。R5RS定义了两个映射过程:其一为返回转化后的表的map过程,另一为注重副作用的for-each过程。
map过程的格式如下:
(map procedurelist1 list2…)
procedure是个与某个过程或lambda表达式相绑定的符号。作为参数的表的个数视procedure需要的参数而定。
(map+‘(1 3 5)‘(2 4 6))
;Value:(3 7 11)
(map(lambda (x) (* x x))‘(1 2 3))
;Value:(1 4 9)
通过类比可以发现后者的lambda表达式相当于前者的+函数。只不过后者只有一个list,而前者有2个。如果想要像前者一样,让两个list中的元素一次相乘,除了用*外,也可以用lambda表达式。