Clone of Compose vs Pipe 区别

编程里的 compose 与 pipe 都是组合 fns ,2者的区别是什么

在编程中,composepipe 都是用于组合多个函数(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


需要我给你实现一个通用的 composepipe 吗?