3

假设我有 3 个数组

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

我想创建一个咖喱函数,在其中设置第一个参数,指示我想在作为参数传递的数组中添加哪个单元格......理想情况下,我希望该函数能够获取无限数量的数组......

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

因此这样做:

mycurriedfunction(1)(first) 将返回 1

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

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

这甚至可能吗?

如果不是,那么有哪些替代方案可以实现相似甚至相同的结果?

4

2 回答 2

4

不,一个值不可能既是数字又是函数。

你应该让你的函数取而代之的是一个列表,或者被制定为一个 reducer。

于 2016-03-29T15:47:11.290 回答
3

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

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

function sumIdx(idx) {
  function f(value) {
    function g(arr) {
      return f(value + arr[idx]);
    }
    g.value = value;
    return g;
  }
  return f(0);
}

这可以像您的示例一样使用,不同之处在于您需要value在完成后从属性中提取结果。

const first  = [0, 1, 2];
const second = [3, 4, 5];
const third  = [6, 7, 8];

sumIdx(2)(first)(second)(third).value // 15

虽然可能,但我可能不建议使用这种方法。也许使用单独的数据类型会更好地表示这种行为(或者按照 Scott Sauyet 的建议更改您的 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方法而不是直接调用结果。

sumIdx(2).next(first).next(second).next(third).value // 15
于 2016-03-29T23:47:02.930 回答