函数柯里化

函数柯里化

Charliexiu Lv2
  • 你可以一次性地调用 curry 函数,也可以每次只传一个参数分多次调用。

curry 的用处非常广泛,就像在 hasSpacesfindSpaces 和 censored 看到的那样,只需传给函数一些参数,就能得到一个新函数。

用 map 简单地把参数是单个元素的函数包裹一下,就能把它转换成参数为数组的函数。

概念

只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。

1
2
3
4
5
var getChildren = function(x) {
return x.childNodes;
};

var allTheChildren = map(getChildren);

通过简单地传递几个参数,就能动态创建实用的新函数;而且还能带来一个额外好处,那就是保留了数学的函数定义,尽管参数不止一个。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var add = function(x) {
return function(y) {
return x + y;
};
};

var increment = add(1);
var addTen = add(10);

increment(2);
// 3

addTen(2);
// 12

这里我们定义了一个 add 函数,它接受一个参数并返回一个新的函数。调用 add 之后,返回的函数就通过闭包的方式记住了 add 的第一个参数。一次性地调用它实在是有点繁琐,好在我们可以使用一个特殊的 curry 帮助函数(helper function)使这类函数的定义和调用更加容易。

我们来创建一些 curry 函数享受下(译者注:此处原文是“for our enjoyment”,语出自圣经)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var curry = require('lodash').curry;

var match = curry(function(what, str) {
return str.match(what);
});

var replace = curry(function(what, replacement, str) {
return str.replace(what, replacement);
});

var filter = curry(function(f, ary) {
return ary.filter(f);
});

var map = curry(function(f, ary) {
return ary.map(f);
});
  • 标题: 函数柯里化
  • 作者: Charliexiu
  • 创建于: 2023-04-19 00:03:54
  • 更新于: 2023-04-19 00:07:42
  • 链接: https://ccharlie-xiu.github.io/2023/04/19/函数柯里化/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
此页目录
函数柯里化