把操作本身当作输入

程序可以把数字和文本传给函数,也可以把“怎样处理数据”的函数传进去。高阶函数利用后一种方式,把变化的操作放在参数中。例如同样遍历一个列表,可以分别对每项求平方或转成文本,不必为每种计算重新编写遍历与结果收集的全部过程。

参考:[1]

公共结构与具体规则

映射对每个元素应用变换,筛选根据判断保留元素,折叠则用一项组合规则逐步累积。它们并非相同操作的不同名称,而是保留不同计算结构。选择合适的高阶函数,可以让代码直接表达数据处理关系,减少循环细节掩盖了实际意图的情况。

参考:[2]

返回可定制的函数

高阶函数也可以把一部分条件固定下来,再返回接收其余输入的函数。返回的函数若使用外层的局部绑定,就涉及闭包与环境的保存。这里的高阶说的是输入或结果中包含函数,不表示算法一定更复杂,也不表示它在类型系统中必然采用某种特定阶数。

参考:[1]

副作用与执行次序

传入的函数可能读取文件、修改状态或抛出异常,因此高阶形式并不自动保证纯粹、并行或没有错误。实现是否惰性、按照什么次序应用回调,也要依据语言和接口约定。理解抽象后仍需检查执行行为,尤其不能假定一个看似相同的遍历在所有语言中都会以同样方式运行。

参考:[2]