高阶函数
在数学和计算机科学中,高阶函数是至少具有下列功能之一的函数:
- 将一个或多个函数作为参数(即过程参数)。
- 返回一个函数作为结果。
所有其他函数都是一阶函数。在数学中,高阶函数也称为算子或泛函。微积分中的微分算子是一个很常见的例子,因为它把一个函数映射到它的导数,也是一个函数。在整个数学过程中,高阶函数不应与“函子”一词的其他用法混淆,参见函子(消除歧义)。
在无类型的匿名微积分,所有的函数都是高阶。一个有类型的匿名的微积分,大部分的编程函数语言从里面派生出来,以一个函数作为参数的高阶函数是具有表单类型的值。
普遍例子
- map函数在许多函数式编程语言中都有,它是高阶函数的一个例子。它接受一个函数f和一个元素列表作为参数,结果返回一个新列表,其中f应用于列表中的每个元素。
- 排序函数,它将比较函数作为参数,允许程序员将排序算法与正在排序的项的比较分开。C标准函数qsort就是一个例子。
- fold
- Function composition
- Integration
- Callback
- Tree traversal
编程语言支持
直接支持
这些示例并不打算比较和对比编程语言,而是作为高阶函数语法的示例。
在下面的示例中,高阶函数两次接受一个函数,并两次将该函数应用于某个值。如果必须对同一个f应用两次,那么最好返回一个函数而不是一个值。这符合“不要重复自己”的原则。
OCAML(简单一个例子)
直白的:
let add3 x = x + 3
let twice f x = f (f x)
print_int (twice add3 7) (* 13 *)
一行:
print_int ((fun f x -> f (f x)) ((+)3) 7) (* 13 *)
Python
>>> def twice(f):
... def result(a):
... return f(f(a))
... return result
>>> plusthree = lambda x: x+3
>>> g = twice(plusthree)
>>> g(7)
13
java的代码(对于我小白来说有点反人类)
Function<Function<Integer, Integer>, Function<Integer, Integer>> twice = f -> f.andThen(f);
twice.apply(x -> x + 3).apply(7); // 13