柯里化函数与多个连续箭头函数

3 minute read

柯里化函数与多个连续箭头函数

柯里化

在计算机科学中,柯里化(英语:Currying),又译为卡瑞化或加里化, 是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数, 并且返回接受余下的参数而且返回结果的新函数的技术。 这个技术由克里斯托弗·斯特雷奇以逻辑学家哈斯凯尔·加里命名的, 尽管它是Moses Schönfinkel和戈特洛布·弗雷格发明的。

说的明白一点就是,给函数传递一部分参数,让它返回一个函数去处理其他参数,举个例子,求三个数之和:

 1let addOne = function add(x) {
 2    return function(y) {
 3        return function(z) {
 4            return x + y + z
 5        }
 6    }
 7}
 8let one = addOne(3)   // 函数工厂  : 创造函数的工厂  创建一个one 函数
 9console.log(one) //ƒ (y) {return function (z) {return x + y + z}}
10let two = one(4)
11console.log(two) //ƒ (z) {return x + y + z}
12let three = two(5)
13console.log(three) //12

多个连续箭头函数

1function add(a) {
2    return function(b) {
3        return a + b
4    }
5}
6
7var add3 = add(3)
8add3(4) === 3 + 4 //true

add 函数 在 es6 里的写法等价为

1let add = a => b => a + b

其实以上就是 柯里化函数 只不过用 es6 写,变了一个样子,后面详细介绍它的原理和特点。

关键就是理解柯里化,其实可以把它理解成,柯里化后,将第一个参数变量存在函数里面了(闭包–返回一个函数,可访问私有方法和变量),然后本来需要n个参数的函数可以变成只需要剩下的(n - 1个)参数就可以调用,比如

1let add = x => y => x + y
2let add2 = add(2)

本来完成 add 这个操作,应该是

1let add = (x, y) => x + y

它需要俩参数,而现在 add2 函数完成同样操作只需要一个参数,这在函数式编程中广泛应用。

详细解释一下,就是 add2 函数 等价于 有了 x 这个闭包变量的 y => x + y 函数

并且此时 x = 2,所以此时调用

1add2(3) === 2 + 3