compose 即函数嵌套组合
组合 compose 在第一篇已经初见端倪, 可以感受一下. compose 函数的实现用闭包的方法. 不完善实现如下:
- const compose = (f, g) => {
- return x => f(g(x));
- };
compose 使用实例
你可以用 ramda 的 compose 函数, 而不是自己实现.
- import {
- compose
- } from 'ramda'
- const f = (x: number) => 2 * x
- const g = (y: number) => y + 1
- const w = compose(g, f);
- console.log(w(1)) // 3
- console.log(w(2)) // 5
- console.log(w(3)) // 7
compose 的数学特性
有了 compose, 我们可以很方便的组合, 可以使用结合律, 即
compose(toUpperCase, compose(head, reverse));
或者
compose(compose(toUpperCase, head), reverse);
你可以想想初中数学, 这是成立的. 现在多个函数组合成一个大函数, 我们的代码开始变得巧妙起来了.
compose 天生 pointFree
用 compose 组合的就是 pointFree 代码, 即你无需指定传递的形参, 你可以看看 w 函数, 就知道了. 是不是更妙了? 其实离上一个妙, 我们什么也没做. 哈哈哈! 组合像一系列管道那样把不同的函数联系在一起 ---- 原文
要注意的是
compose 只将不同函数的输出与输入相连, 上面代码有一些致命问题, 无法分支! 或者分支成本巨大, 举个例子, 如果 reverse 出错, 那么后续就会继续执行, head 将拿到错误的输入, 继续输出, toUpperCase 就错上加错了, 当然你可以在每个函数内做严谨的 if/else 判断, 可是成本巨大. 目前 compose 就是一匹脱了缰的骏马.
来源: https://www.cnblogs.com/Yang-kid/p/9715700.html