第4章 函数是一等值
在函数式编程的标准或特点中,“函数是一等值”是最基本和重要的,也是最为人所知的,所有介绍函数式编程的书籍和文章都会优先介绍这一点,以至于“一等值”几乎成为函数的专属头衔,听上去就像“王牌”一类的文学修辞,而实际上却两者皆不是。一等(First-class)是编程语言中值的通用修饰词,只要某个值满足以下三个条件,就能被称为一等值。
- 可以作为参数传递给函数
- 可以作为函数返回值
- 可以被赋值给变量
所以数字、字符串等常用的值都是一等的。如果仅满足第一条,而不能作为函数返回值或被赋值给变量,就称为二等的(Second-class)。假如三条都不满足,则称为三等的(Third-class)。例如,标签(Label)在支持它的语言中基本上都是三等的(只能用于goto等语句,不能作为参数传递给函数等等)。函数值的情况最多样,在Basic语言中是三等值,在Pascal中是二等值,在C、Fortran、C#等语言中是一等值,当然在所有函数式编程语言如Scheme、Haskell、Clojure中都是一等值。
此外,依赖变量和赋值是命令式编程的特点,函数式编程因为从原则上排斥状态,不鼓励使用变量,纯粹的函数式编程语言甚至没有变量,因而在这些语言中,函数是一等值的第三个条件就变为可以被赋值给常量。
4.1 函数参数
4.1.1 数组的迭代方法
4.1.2 设计函数参数
4.2 函数返回值
4.2.1 判断数据类型
4.2.2 日志
4.2.3 读取对象属性
4.3 高阶函数
4.3.1 组合谓词函数
4.3.2 改变函数参数数目
4.3.3 检查参数类型
4.3.4 记忆化
缓存是提高程序性能的重要技术,对于输入输出、高耗资源的计算等需要花费较长时间的功能,将结果保存在能快速访问的载体里,以后遇上同样的调用,就直接读取上次保存的结果,从而大大节省时间,简言之,就是“以