函数式编程之Compose

Posted Vue中文社区

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数式编程之Compose相关的知识,希望对你有一定的参考价值。

Compose基本概念

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

constcompose=(f,g)=>(...arg)=>f(g(...arg))

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

让我们来尝试使用一下组合

        
          
          
        
  1. let toUpperCase = (x) => x.toUpperCase();

  2. let exclaim = (x) => x + '!';

  3. let shout = compose(toUpperCase,exclaim);

  4. shout('hello world')

  5. // HEELO WORLD !

pointfree 模式

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

        
          
          
        
  1. // 非 pointfree, 因为提到了数据 word

  2. let snakeCase = (word) => word.toUpperCase().replace(/\s+/ig,'-');

  3. // pointfree

  4. let snakeCase = compose(replace(/\s+/ig,'-'),toUpperCase)

pointfree 模式能够帮助我们减少不必要的命名,让代码保持简洁和通用。对函数式代码来说,pointfree 是非常好的石蕊试验,因为它能告诉我们一个函数是否是接受输入返回输出的小函数。

一些问题

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

        
          
          
        
  1. // 摘自 https://github.com/reactjs/redux/blob/master/src/compose.js

  2. export default function compose(...funcs) {

  3.  if (funcs.length === 0) {

  4.    return arg => arg

  5.  }

  6.  if (funcs.length === 1) {

  7.    return funcs[0]

  8.  }

  9.  return funcs.reduce((a, b) => (...args) => a(b(...args)))

  10. }

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



FEweekly

强者怒时向更强者挑衅

弱者怒时向更弱者挑衅

以上是关于函数式编程之Compose的主要内容,如果未能解决你的问题,请参考以下文章

函数式编程[4]functor和monad

函数式编程-compose与pipe

js函数式编程curry与compose实现

快速写curry函数和compose函数

函数式编程,真香

函数compose 函数和 pipe 函数