简单的梳理一下函数式编程的相关知识点。
首先来看什么才是函数式编程(functional programming)。
来自 wikipedia 的定义
In computer science, functional programming is a programming paradigm—a style of building the structure and elements of computer programs—that treats computation as the evaluation of mathematical functions and avoids changing-state and mutable data…
函数式编程(英语:functional programming)或称函数程序设计,又称泛函编程,是一种编程范型,它将电脑运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。函数编程语言最重要的基础是λ演算(lambda calculus)。而且λ演算的函数可以接受函数当作输入(引数)和输出(传出值)
根据定义,我们可以得出函数式编程的几个特点:
函数式编程的很多优势,都是围绕着纯函数
这个概念的。
因为是纯函数
,所以输入不变,那么输出肯定是不变的;因为这种前后的一致性,就为测试带来了很大的便利。
另外,因为是纯函数
,其实也就并不存在全局变量
的这个概念,所有的数据就是在类似pipe
的管道中流动,每个函数的输出都是一个全新的数据,并不会修改传入的数据;因为无副作用,所以可以说函数式编程是”安全”的。
这里的 Currying
并不是咖喱,而是传说中的柯里化。 简单来说,柯里化就是将多参数的函数变成单参数的函数,例如:
// origin:
function add (x, y) {
return x + y
}
var a = add(1, 2)
// after currying:
function add(x) {
return function (y) {
return x + y
}
}
var b = add(1)(2)
这样看起来柯里化似乎没有什么优势,但是再看一下接下来的代码:
var a = add(10, 1)
var b = add(10, 2)
var c = add(10, 3)
可以看到这三次调用,都是在10
的基础上再加上一个参数,那么运用柯里化,可以改造成这样:
function addNumber(x) {
return function (y) {
return x + y
}
}
var addTen = addNumber(10)
var a = addTen(1)
var b = addTen(2)
var c = addTen(3)
每次只传入一个参数,看起来清爽,调用起来也更自由。这里只是个最简单的应用,在更多参数的情景中,柯里化的作用会更加明显。
Monad 可以理解为是函数式编程的单元,一个 Monad
// 未完待续