JavaScript中具有未知参数的curry函数

JavaScript中具有未知参数的curry函数,javascript,functional-programming,Javascript,Functional Programming,在最近的一次采访中,我被要求编写一个函数,用于添加数字并接受如下参数: add(1)(2)(3) // result is 6 add(1,2)(3,4)(5) // result is 15 const addTwo = add(2); console.log(+addTwo(5)); // 7 参数的数量不是固定的,参数可以在集合中传递,也可以单独传递 如何实现此add功能?根据您的示例,参数的数量在某些方面是固定的 正如@ASDFGerte指出的,您的示例似乎在三次调用后返回结果。在这

在最近的一次采访中,我被要求编写一个函数,用于添加数字并接受如下参数:

add(1)(2)(3) // result is 6
add(1,2)(3,4)(5) // result is 15
const addTwo = add(2);
console.log(+addTwo(5)); // 7
参数的数量不是固定的,参数可以在集合中传递,也可以单独传递


如何实现此
add
功能?

根据您的示例,参数的数量在某些方面是固定的

正如@ASDFGerte指出的,您的示例似乎在三次调用后返回结果。在这种情况下,一个没有引入变量和curry等术语的简单实现可能是

函数添加(…args1){
返回函数(…args2){
返回函数(…args3){
返回args1.concat(args2).concat(args3).reduce((a,b)=>a+b)}
控制台日志(添加(1)(2)(3))

log(添加(1,2)(3,4)(5))
我参加聚会有点晚了,但这样做会奏效(我觉得有点老套):

此函数返回一个值为和的函数。下面的测试输出的是强制值,而不是实际函数

console.log(+add(1,2)(3,4)(5)); // 15
console.log(+add(1)) // 1
console.log(+add(1)(2)) // 3
console.log(+add(1)(2)(3)) // 6
console.log(+add(1)(2)(3)(4)) // 10
由于它是一个currying函数,因此它将始终返回另一个函数,因此您可以执行以下操作:

add(1)(2)(3) // result is 6
add(1,2)(3,4)(5) // result is 15
const addTwo = add(2);
console.log(+addTwo(5)); // 7

所以你想实现一个可变函数?我认为这是不可能的,但是有很多相关的问题。我肯定你在假定的面试中做了一些尝试,你为什么不在这里做呢?此外,它非常接近于codewars,您可以选择退出相关的kata来查看解决方案。另外请注意,您的函数描述不正确-每次调用三次后返回的结果是什么?可能重复(通过谷歌找到)@ASDFGerte:我不确定您所说的“选择退出相关的kata”是什么意思。我没有看到任何解决方案提到那里,只是选择接受挑战!我知道。如果你真的想实现一个变量函数,你想要的是不可能的。想想看:curry意味着如果不是所有参数都被传递,则返回一个较低的算术数的函数,如果所有参数都被传递,则最终返回结果。但是,由于变量函数接受无限数量的参数,所以您不知道何时完成。因此在另一个问题中使用了“hacks”。我们可以检查函数参数是否
未定义
,如果是,则停止返回新函数。因此,这里可能有一个递归函数来检查这个条件是否有效?它可以,但是您应该执行
add(1)(2)(3)(
Ok。但我不知道这将如何运作。你能给我一个更详细的解释吗?