2-函数式编程 、组合(01-01-02)

296 阅读3分钟

1、函数组合

函数组合 (compose):如果一个函数要经过多个函数处理才能得到最终值,这个时候可以把中间 过程的函数合并成一个函数 函数就像是数据的管道,函数组合就是把这些管道连接起来,让数据穿过多个管道形成最终 结果 函数组合默认是从右到左执行

2、lodash 中的组合函数

lodash 中组合函数 flflow() 或者 flflowRight(),他们都可以组合多个函数 flow() 是从左到右运行 flowRight() 是从右到左运行,使用的更多一些

3、lodash/fp

lodash 的 fp 模块提供了实用的对函数式编程友好的方法 提供了不可变 auto-curried iteratee-fifirst data-last 的方法 函数优先 数据滞后

4、Point Free

Point Free:我们可以把数据处理的过程定义成与数据无关的合成运算,不需要用到代表数据的那个参 数,只要把简单的运算步骤合成到一起,在使用这种模式之前我们需要定义一些辅助的基本运算函数。 不需要指明处理的数据 只需要合成运算过程 需要定义一些辅助的基本运算函数

5、什么是 Functor

容器:包含值和值的变形关系(这个变形关系就是函数) 函子:是一个特殊的容器,通过一个普通的对象来实现,该对象具有 map 方法,map 方法可以运 行一个函数对值进行处理(变形关系)

// 一个容器,包裹一个值
class Container {
// of 静态方法,可以省略 new 关键字创建对象
  static of (value) {
    return new Container(value) 
  }
  constructor (value) {
    this._value = value
  }
  // map 方法,传入变形关系,将容器里的每一个值映射到另一个容器
  map (fn) {
    return Container.of(fn(this._value))
  }
}

总结

函数式编程的运算不直接操作值,而是由函子完成 函子就是一个实现了 map 契约的对象 我们可以把函子想象成一个盒子,这个盒子里封装了一个值 想要处理盒子中的值,我们需要给盒子的 map 方法传递一个处理值的函数(纯函数),由这 个函数来对值进行处理 最终 map 方法返回一个包含新值的盒子(函子)

MayBe 函子

我们在编程的过程中可能会遇到很多错误,需要对这些错误做相应的处理 MayBe 函子的作用就是可以对外部的空值情况做处理(控制副作用在允许的范围)

Either 函子

Either 两者中的任何一个,类似于 if...else...的处理 异常会让函数变的不纯,Either 函子可以用来做异常处理

IO 函子

IO 函子中的 _value 是一个函数,这里是把函数作为值来处理 IO 函子可以把不纯的动作存储到 _value 中,延迟执行这个不纯的操作(惰性执行),包装当前的操 作纯 把不纯的操作交给调用者来处理

Task 异步执行

异步任务的实现过于复杂,我们使用 folktale 中的 Task 来演示 folktale 一个标准的函数式编程库 和 lodash、ramda 不同的是,他没有提供很多功能函数 只提供了一些函数式处理的操作,例如:compose、curry 等,一些函子 Task、Either、 MayBe 等

Pointed 函子

Pointed 函子是实现了 of 静态方法的函子 of 方法是为了避免使用 new 来创建对象,更深层的含义是 of 方法用来把值放到上下文 Context(把值放到容器中,使用 map 来处理值)

Monad(单子)

Monad 函子是可以变扁的 Pointed 函子,IO(IO(x)) 一个函子如果具有 join 和 of 两个方法并遵守一些定律就是一个 Monad