函数式编程 基本概念

@eyasliu 2016-05-22 05:26:59发表于 eyasliu/blog 草稿

一等函数

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

  • 函数可以存储为变量
  • 可以作为数组的一个元素
  • 作为对象的成员变量
  • 可在使用时创建
  • 可以被传递给另一个函数(作为参数)
  • 可以被另一个函数返回(作为返回值)

纯函数

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

  • 函数可以自给自足

  • 无副作用

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

    纯函数的好处

    • 可缓存
    • 可移植性/自文档化(自给自足)
    • 可测试
    • 合理性
    • 并行

高阶函数

  • 以函数作为参数
  • 返回值是函数
_.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