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 吗?