eyasliu / blog

博客文章
179 stars 13 forks source link

函数式编程 基本概念 #6

Open eyasliu opened 8 years ago

eyasliu commented 8 years ago

一等函数

“一等公民”函数可以去任何可以去的地方,很少有限制

纯函数是这样一种函数,即相同的输入,永远会得到相同的输出,而且没有任何可观察的副作用

  • 函数可以自给自足
  • 无副作用
  • 副作用是在计算结果的过程中,系统状态的一种变化,或者与外部世界进行的可观察的交互
  • 只要是跟函数外部环境发生的交互就都是副作用

纯函数的好处

_.each([], item => {}) // lodash each example

函数柯里化 (curry)

curry 的概念很简单: 只传递给函数一部分参数来调用它,让它返回一个函数去处理剩下的参数

策略性地把要操作的数据放到最后一个参数里

传给函数一些参数,就能得到一个新函数

// curry 前
let sum = add(1, 2) // sum = 3

// curry 后
let addOne = add(1);
let sum = addOne(2); // sum = 3

// curry后简写
let sum = add(1)(2)

代码组合(compose)

组合看起来像是在饲养函数。你就是饲养员,选择两个有特点又遭你喜欢的函数,让它们结合,产下一个崭新的函数.

让代码从右向左运行,而不是由内而外运行,我觉得可以称之为“左倾”

// 两个函数
let addTen = x => x + 10;
let addTwo = x => x + 2;

// 组合前
let tmp = addTen(5)  // tmp = 15
let result = addTwo(tmp); // result = 17

// 组合后
let compose = (f,g) => f(g);
let addTwelve = compose(addTen, addTwo);
let result = addTwelve(5) // result = 17