使用Ramda进行函数式编程:你可以讨论一个带有无限数量参数的函数

时间:2016-03-29 13:37:36

标签: functional-programming currying ramda.js

我们说我有3个阵列

var first = [0, 1, 2, 3];
var second = [0, 1, 2, 3];
var third = [0, 1, 2, 3];

我想做一个curried函数,我设置第一个参数,指示我想在作为参数传递的数组中添加哪个单元格...理想情况下,我希望该函数能够使用无限数量的数组。 ...

例如: mycurriedfunction(1)意味着我想访问我传入的数组的单元格1的值并将它们一起添加。

因此做:

mycurriedfunction(1)(first)将返回1

mycurriedfunction(1)(first)(second)会返回2

mycurriedfunction(2)(first)(second)(third)将返回6

这甚至可能吗?

如果没有,那么有什么替代选择可以实现类似甚至相同的结果?

2 个答案:

答案 0 :(得分:4)

不,一个值既不是数字也不是函数。

您应该将您的功能改为列表,或者将其表述为减速器。

答案 1 :(得分:4)

正如其他人所提到的,你所描述的功能无法知道是否要返回下一个要调用的函数或最终值。

如果你真的想要实现类似的接受无限数量的数组的东西,你可以稍微调整它以将累积的值存储为返回函数的属性。

$(document).ready(function(){
    $.get("/portfolio/model", function(data){
        console.log(data);
        $('div .model').html(data);
});

这可以像您的示例一样使用,区别在于您需要在完成后将结果从function sumIdx(idx) { function f(value) { function g(arr) { return f(value + arr[idx]); } g.value = value; return g; } return f(0); } 属性中拉出来。

value

虽然可能,但我可能不建议使用这种方法。也许使用单独的数据类型可以更好地表示这种行为(或者像Scott Sauyet建议const first = [0, 1, 2]; const second = [3, 4, 5]; const third = [6, 7, 8]; sumIdx(2)(first)(second)(third).value // 15 更改您的API)。

myFn(2, [first, second, third])

这里的不同之处在于您需要调用class SumIdx { constructor(idx, value) { this.idx = idx; this.value = value; } next(arr) { return new SumIdx(this.idx, this.value + arr[this.idx]); } } const sumIdx = idx => new SumIdx(idx, 0); 方法而不是直接调用结果。

next