函数式编程之Compose

Compose基本概念

顾名思义,在函数式编程中,Compose 就是将几个有特色的函数拼凑在一块儿, 让它们结合, 产生一个崭新的函数,以下就是组合react

const compose = (f,g) => (...arg) => f(g(...arg))git

f跟g在如上都是函数,...arg是在他们之间经过管道(pipe)传输的值github

让咱们来尝试使用一下组合编程

let toUpperCase = (x) => x.toUpperCase();
let exclaim = (x) => x + '!';
let shout = compose(toUpperCase,exclaim);
shout('hello world')
// HEELO WORLD !复制代码

pointfree 模式

pointfree模式指的是,永远没必要说出你的数据,它的意思是指函数无须说起将要操做的数据是什么样的,一等公民的函数,curry 以及compose 协做起来很是有助于实现这种模式redux

// 非 pointfree, 由于提到了数据 word
let snakeCase = (word) => word.toUpperCase().replace(/\s+/ig,'-');
// pointfree
let snakeCase = compose(replace(/\s+/ig,'-'),toUpperCase)复制代码

pointfree 模式可以帮助咱们减小没必要要的命名,让代码保持简洁和通用。对函数式代码来讲,pointfree 是很是好的石蕊试验,由于它能告诉咱们一个函数是不是接受输入返回输出的小函数。数组

一些问题

回到楼上,咱们能够看到上面的compose示例都只是传入了两个函数,由于咱们的compose实现也只支持两个函数,那么若是咱们想要支持一条很长很长的管道的时候,显然上面的compose就不够用了,下面咱们能够来看看redux是如何实现compose的bash

// 摘自 https://github.com/reactjs/redux/blob/master/src/compose.js
export default function compose(...funcs) {
  if (funcs.length === 0) {
    return arg => arg
  }
  if (funcs.length === 1) {
    return funcs[0]
  }
  return funcs.reduce((a, b) => (...args) => a(b(...args)))
}复制代码

代码很简洁,利用了数组的reduce方法来处理,就这样, 想拼多长就多长函数式编程

相关文章
相关标签/搜索