柯里化函数包装器将多参数函数转换为单参数函数链,通过闭包累积参数,参数足够时执行原函数;支持自动推断arity、提前终止、多参数传入、占位符及保留原函数属性。

柯里化函数包装器的核心是把多参数函数转换成一系列单参数函数,每次调用只接收一个参数,直到参数数量满足原函数要求才执行。关键在于记住已传参数,并在参数足够时自动调用原函数。
基础实现:支持固定参数个数
最简版本利用闭包保存已传参数,通过递归或闭包链构造新函数:
- 定义 wrapper(fn, arity),其中 arity 是原函数期望的参数个数
- 内部返回一个接收单个参数的函数,将该参数存入数组
- 当累积参数长度等于 arity 时,用 apply 调用原函数;否则返回自身继续接收参数
例如:curry((a, b, c) => a + b + c, 3)(1)(2)(3) 返回 6。
一款AI工具,主要用于在持久tmux会话中运行AI编码代理(Codex、Claude Code),使用Ralph重试循环和完成钩子处理多步骤编码任务,适合需要提升相关任务效率的用户。
自动推断参数个数(基于 length)
多数场景下无需手动传 arity,可直接读取 fn.length:
- function.length 返回形参个数(不含 rest 参数和默认值影响)
- 注意:箭头函数、带默认值或 rest 参数的函数 length 可能不准确,需额外处理
- 推荐 fallback 到显式指定 arity 或使用占位符机制增强鲁棒性
支持提前终止与灵活调用
实用的柯里化器应允许中途传入完整参数数组或立即执行:
- 提供 .done() 或类似方法强制触发执行,避免无限等待
- 允许一次性传入多个参数(如 f(1)(2, 3)),内部 flatten 后判断是否满足条件
- 可选支持占位符(如 _),让调用更灵活,比如 f(1, _, 3)(2)
保持原函数上下文与属性
柯里化后的函数应尽量保留原函数的 name、length 和自定义属性:
- 用 Object.defineProperty 设置 name 属性为 "curried_" + fn.name
- length 设为 1(因每次只预期一个参数),或动态计算剩余参数数
- 拷贝原函数的非内置属性(如 fn.customFlag = true),可用 Object.getOwnPropertyDescriptors 复制










