作者:月影
牢记:函数式编程不是用函数来编程!!!
23.4函数式编程
23.4.1 什么是函数式编程
什么是函数式编程?如果你这么直白地询问,会发现它竟是一个不太容易解释的概念。许多在程序设计领域有着多年经验的老手,也无法很明白地说清楚函数式编程到底在研究些什么。函数式编程对于熟悉过程式程序设计的程序员来说的确是一个陌生的领域,闭包(closure),延续(continuation),和柯里化(currying)这些概念看起来是这么的陌生,同我们熟悉的if、else、while没有任何的相似之处。尽管函数式编程有着过程式无法比拟的优美的数学原型,但它又是那么的高深莫测,似乎只有拿着博士学位的人才玩得转它。
提示:这一节有点难,但它并不是掌握JavaScript所必需的技能,如果你不想用JavaScript来完成那些用Lisp来完成活儿,或者不想学函数式编程这种深奥的技巧,你完全可以跳过它们,进入下一章的旅程。
那么回到这个问题,什么是函数式编程?答案很长……
函数式编程第一定律:函数是第一型。
这句话本身该如何理解?什么才是真正的第一型?我们看下面的数学概念:
二元方程式 F(x, y) = 0,x, y 是变量, 把它写成 y = f(x), x是参数,y是返回值,f是由x到y的映射关系,被称为函数。如果又有,G(x, y, z) = 0,或者记为 z = g(x, y),g是x、y到z的映射关系,也是函数。如果g的参数x, y又满足前面的关系y = f(x), 那么得到z = g(x, y) = g(x, f(x)),这里有两重含义,一是f(x)是x上的函数,又是函数g的参数,二是g是一个比f更高阶的函数。
这样我们就用z = g(x, f(x)) 来表示方程F(x, y) = 0和G(x, y, z) = 0的关联解,它是一个迭代的函数。我们也可以用另一种形式来表示g,记z = g(x, y, f),这样我们将函数g一般化为一个高阶函数。同前面相比,后面这种表示方式的好处是,它是一种更加泛化的模型,例如T(x,y) = 0和G(x,y,z) = 0的关联解,我们也可以用同样的形式来表示(只要令f=t)。在这种支持把问题的解转换成高阶函数迭代的语言体系中,函数就被称为“第一型”。
JavaScript中的函数显然是“第一型”。下面就是一个典型的例子:
Array.prototype.each = function(closure)