函数组合(compose)是将多个单参数函数按右到左顺序串联,compose(f, g, h)(x) 等价于 f(g(h(x))),核心实现为 const compose = (...fns) => (x) => fns.reduceright((acc, fn) => fn(acc), x)。

函数组合(Compose)是把多个函数像管道一样串起来,让数据依次流经每个函数,前一个函数的输出作为后一个函数的输入。核心思想是“右到左”执行(数学传统),即 compose(f, g, h)(x) 等价于 f(g(h(x)))。
基础实现:从右往左执行
最简版本用 reduceRight 实现:
const compose = (...fns) => (x) => fns.reduceRight((acc, fn) => fn(acc), x);
例如:
const add1 = x => x + 1; const double = x => x * 2; const toString = x => String(x); <p>const f = compose(toString, double, add1); console.log(f(3)); // "8" → 先 add1(3)=4,再 double(4)=8,最后 toString(8)="8"</p>
更健壮的 compose:支持无参/多参函数?
标准 compose 只处理**单参数函数**,这是函数式编程的约定。如果中间函数需要多个参数,应先用闭包或 curry 固定其他参数:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ❌ 错误写法:
compose(f, Math.max)——Math.max接收任意个参数,但上一步只传一个值,结果不对 - ✅ 正确写法:
compose(f, x => Math.max(x, 10))或compose(f, curry(Math.max)(10))
常见变体:pipe(从左到右)
很多人更习惯“数据流向”从左到右,这时用 pipe 更直观:
const pipe = (...fns) => (x) => fns.reduce((acc, fn) => fn(acc), x); <p>// pipe(add1, double, toString)(3) → toString(double(add1(3))) → "8"</p>
React 生态(如 Redux Toolkit)常用 pipe 风格;而 Ramda、Lodash/fp 默认提供 compose(右到左)和 pipe 两个版本。
实际使用建议
- 优先用
pipe,语义更贴近“数据流”,新人易理解 - 确保所有函数都是纯函数、只接收一个参数,否则组合会出错
- 调试时可插入
x => (console.log(x), x)查看中间值 - 现代项目推荐直接用成熟库:
lodash/fp.compose、ramda.compose或fp-ts/function
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










