函数柯里化是pipe正向流动的基础,它将多参函数转为单参函数链,使pipe能按序组装并触发各步骤,每步输出即下一步输入,形成纯函数、同步、单参数的正向数据流。

函数柯里化在自定义 Pipe 函数中,核心是让每个处理函数只接收一个参数(通常是前一步的输出),并返回一个新函数,从而把多个单参函数串成一条正向流动的数据链。Pipe 本身不执行逻辑,只负责按序“组装”和“触发”这些柯里化后的函数。
柯里化是 Pipe 正向流动的基础
柯里化把多参函数转为一系列单参函数,例如:add = (a) => (b) => a + b
这样 add(2) 返回一个等待 b 的函数,可直接传入 pipe 链中作为中间步骤。Pipe 每次只把上一环节结果作为唯一参数传给下一环节,天然适配柯里化函数的调用签名。
Pipe 函数需支持自动柯里化或接收已柯里化的函数
实际使用中,有两种常见方式:
-
显式柯里化输入:要求传入的每个函数都已是单参形式,如
(x) => x * 2、(x) => x + 1 -
内置自动柯里化:Pipe 内部对多参函数做转换,比如用
curry(fn)包装,但会增加运行时开销,且可能掩盖参数意图
推荐前者——清晰、可控、无副作用。例如:
数据正向流动的关键在于“结果即输入”
每一步函数的返回值,自动成为下一步的唯一参数,形成明确的单向依赖链:
-
pipe(f, g, h)(x)等价于h(g(f(x))) - 所有中间函数必须是纯函数、同步执行、只接受一个参数
- 若某步需多个参数(如格式化日期),应预先固定其他参数,只留数据参数待传:
formatDate = (locale) => (date) => new Intl.DateTimeFormat(locale).format(date)
然后在 pipe 中写pipe(parse, formatDate('zh-CN'), upperCase)
实用示例:字符串清洗管道
假设要对用户输入做标准化处理:
const trim = (s) => s.trim();const toLower = (s) => s.toLowerCase();
const removeExtraSpaces = (s) => s.replace(/\s+/g, ' ');
const sanitize = pipe(trim, toLower, removeExtraSpaces);
console.log(sanitize(" HELLO WORLD ")); // "hello world"
每一步只关心上一步的输出,不感知上下文,也不修改外部状态——这正是正向流动的本质。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











