Skip to content

Latest commit

 

History

History
87 lines (58 loc) · 1.66 KB

File metadata and controls

87 lines (58 loc) · 1.66 KB
marp theme paginate header
true
uncover
true
函数式编程指南 第6章:示例应用

bg right fit

第 6 章

《函数式编程指南》

示例应用


声明式代码

  • 不同于命令式的一步一步指令,声明式写的是表达式
  • 以SQL为例,没有“先做这个,再做那个”的指令
    只有取什么数据的表达式,引擎自己决定如何取数据

命令式 vs 声明式

// 命令式
const makes = [];
for (let i = 0; i < cars.length; i += 1) {
  makes.push(cars[i].make);
}

// 声明式
const makes = cars.map(car => car.make);

  • map函数如何具体实现,有很大的自由
  • 是what(做什么),不是how(怎么做)
  • "使用命令式循环速度要快很多?" JIT编译器的视频链接

声明式不指定执行顺序

// 命令式
const authenticate = (form) => {
  const user = toUser(form);
  return logIn(user);
};

// 声明式
const authenticate = compose(logIn, toUser);

声明式的好处

  • 为底层的代码变更留下空间,使得顶层的代码成为了一种高级规范(high level specification)
  • 不指定执行顺序,所以适用于并行运算

一个函数式的 Flickr

  • 目标:以声明式的、可组合的方式创建示例应用程序
  • 需求:浏览器 widget,从 Flickr 获取图片,在页面上展示

有原则的重构

// map的结合律
compose(map(f), map(g)) === map(compose(f, g));

总结

  • 小而不失真实的应用中运用函数式编程
  • 用函数式“数学框架”来推导和重构代码