Clone of Compose vs Pipe 区别
编程里的 compose 与 pipe 都是组合 fns ,2者的区别是什么
在编程中,compose
和 pipe
都是用于组合多个函数(fns)的工具,它们的核心思想都是将多个函数按顺序串联起来,形成一个链式调用。但它们之间有一个关键的区别:
🔁 执行顺序不同
✅ compose(f, g)
- 执行顺序:从右到左
- 等价于数学中的函数组合:
f(g(x))
- 读法更接近数学表达式:先做 g,再做 f
const result = compose(f, g)(x); // => f(g(x))
✅ pipe(f, g)
- 执行顺序:从左到右
- 等价于:
g(f(x))
- 更符合人阅读习惯:先做 f,再做 g
const result = pipe(f, g)(x); // => g(f(x))
🧠 类比理解
你可以这样理解两者的区别:
| 操作 | 表达式 | 实际执行顺序 |
|------|--------|---------------|
| compose(f, g, h)
| f(g(h(x)))
| h → g → f |
| pipe(f, g, h)
| h(g(f(x)))
| f → g → h |
📦 示例代码(JavaScript)
假设我们有两个函数:
const double = x => x * 2;
const add1 = x => x + 1;
使用 compose
const result = compose(double, add1)(5);
// add1(5) = 6 -> double(6) = 12
console.log(result); // 12
使用 pipe
const result = pipe(double, add1)(5);
// double(5) = 10 -> add1(10) = 11
console.log(result); // 11
🛠️ 常见应用场景
compose
:常见于函数式编程库如 Redux、Ramda,因为其与数学定义一致。pipe
:常见于像 Elm、F# 或者 RxJS 中,因为它更符合“先做什么,再做什么”的自然阅读顺序。
🧩 小结
| 特点 | compose(f, g)
| pipe(f, g)
|
|------------|--------------------------|-------------------------|
| 执行顺序 | 从右到左(数学顺序) | 从左到右(自然顺序) |
| 等价写法 | f(g(x))
| g(f(x))
|
| 适合场景 | 函数式编程、Redux | 数据流处理、RxJS |
如果你喜欢数学风格或使用 Redux 这类框架,用 compose
;
如果你希望逻辑清晰易读,从输入一步步变换输出,用 pipe
。
需要我给你实现一个通用的 compose
或 pipe
吗?