wuye1200 / blog

alber blog
0 stars 0 forks source link

函数式编程记录 #6

Open wuye1200 opened 6 years ago

wuye1200 commented 6 years ago

为何钟爱一等公民?

一个函数被不必要地包裹起来了,而且发生了改动,那么包裹它的那个函数也要做相应的变更。

httpGet('/post/2', function(json){
    return renderPost(json);
});

如果 httpGet 要改成可以抛出一个可能出现的 err 异常,那我们还要回过头去把“胶水”函数也改了。

// 把整个应用里的所有 httpGet 调用都改成这样,可以传递 err 参数。

httpGet('/post/2', function(json, err){
  return renderPost(json, err);
});

写成一等公民函数的形式,要做的改动将会少得多:

httpGet('/post/2', renderPost);  // renderPost 将会在 httpGet 中调用,想要多少参数都行
wuye1200 commented 6 years ago

纯函数的好处

// 不纯的
var minimum = 21;

var checkAge = function(age) {
  return age >= minimum;
};

// 纯的
var checkAge = function(age) {
  var minimum = 21;
  return age >= minimum;
};

可缓存性(Cacheable)

首先,纯函数总能够根据输入来做缓存。实现缓存的一种典型方式是 memoize 技术:

var squareNumber  = memoize(function(x){ return x*x; });

squareNumber(4);
//=> 16

squareNumber(4); // 从缓存中读取输入值为 4 的结果
//=> 16

squareNumber(5);
//=> 25

squareNumber(5); // 从缓存中读取输入值为 5 的结果
//=> 25
wuye1200 commented 6 years ago

柯里化(curry)

不可或缺的 curry

curry 的概念很简单:只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数。 你可以一次性地调用 curry 函数,也可以每次只传一个参数分多次调用。

var add = function(x) {
  return function(y) {
    return x + y;
  };
};

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

increment(2);
// 3

addTen(2);
// 12