You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ramda中curry如何向占位符传递参数?运算结果异常求解

Ramda占位符R.__的核心运行规则

R.__的作用是标记当前调用中需要跳过的参数位置,后续调用传入的参数会先按顺序填补之前所有跳过的空位,没有空位后再按顺序填充后续的参数位。

我们先从你修改后的简化代码入手解释,更容易理解规则:

修改后代码的执行过程

你修改后的代码如下:

const calFourNumbers = (a, b, c, d) => a - b - c + d;
const curriedCalFourNumbers = R.curry(calFourNumbers);
const f = curriedCalFourNumbers(5);
const g = f(__,4);

console.log(g(1,2)) // => 2
console.log(g(1,6)) //=> 6
console.log(g(1,10)) //=> 10

逐步骤拆解:

  1. 执行curriedCalFourNumbers(5):给第1位参数a赋值为5,剩余待填充的参数位按顺序为b(第2位)、c(第3位)、d(第4位),得到函数f
  2. 执行f(__,4):本次调用传入2个参数[__, 4]
    • 首先匹配第一个待填位b,当前第一个参数是__,跳过b的填充
    • 接着匹配第二个待填位c,当前第二个参数是4,给c赋值为4
    • 剩余待填充的参数位变为b(第2位)、d(第4位),得到函数g
  3. 执行g(1,2):本次调用传入2个参数[1,2]
    • 匹配第一个待填位b,赋值为1
    • 匹配第二个待填位d,赋值为2
    • 所有参数填充完成,执行运算:5 - 1 - 4 + 2 = 2,和输出结果一致

同理:

  • g(1,6)对应运算5 -1 -4 +6 =6
  • g(1,10)对应运算5 -1 -4 +10 =10
    完全匹配你的运行结果。

最初版本代码返回2的原因

你最初的代码如下:

const calFourNumbers = (a, b, c, d) => a - b - c + d;
const curriedCalFourNumbers = R.curry(calFourNumbers);
const f = curriedCalFourNumbers(5, __);
const g = f(__,4);

console.log(g(1,2)) //=> result is 2

逐步骤拆解:

  1. 执行curriedCalFourNumbers(5, __):给第1位参数a赋值为5,第二个参数是__跳过b位的填充,剩余待填位还是b(第2位)、c(第3位)、d(第4位),和修改后代码的f完全一致
  2. 后续g的生成和调用逻辑和上面完全相同,最终运算结果也是5 -1 -4 +2 =2

你之前理解错误的核心是误认为4会填充到第4位d,实际上根据规则4填充的是第3位c,d的值是你最后传入的2,所以运算结果和你预期的5-1-2+4=6不符。


内容的提问来源于stack exchange,提问作者franco phong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 15:57:03