如何在 JavaScript 中处理任意数量的参数时进行 curry

How to curry while handling arbitrary number of arguments in JavaScript?

本文关键字:参数 curry 任意数 JavaScript 处理      更新时间:2023-09-26

一个函数multDiv,它将执行以下操作:

multDiv(4)(3)(2) --> 4 x 3/2 = 6

multDiv(2)(1)(1)(6)(3)(2) --> 2 x 1/1 x 6/3 x 2 = 8

参数通过交替的乘法和除法从左到右进行评估。

我不会给出代码 - 这绝对是可行的。问题是您必须在每次函数调用时返回一个函数。因此,没有办法只返回一个数字,而该数字也是一个函数。

我会说在函数本身上添加一个 tap 方法,该方法将在执行一系列multDiv操作后返回当前值。

不使用currying的方法;应该能够使用currying方法返回相同的结果

function multDiv(n) {
  var r = 0
  , n = Array.isArray(n) ? n : Array.prototype.slice.call(arguments);
  n.forEach(function(_, i, array) {
    // multiply
    if (i % 2 === 0) {
      if (array[i + 1]) {
        if (r === 0) {
          r = array[i] * array[i + 1];
        } else {
          r *= array[i + 1]
        }
      }
    } else {
      // divide
      if (array[i + 1]) {
        r /= array[i + 1]
      }
    }
  });
  return r
}
// pass array or parameters; e.g., `[4,3,2]` or `4,3,2`
multDiv(4, 3, 2); // 6
multDiv([2, 1, 1, 6, 3, 2]); // 8

var inputs = document.querySelectorAll("input"),
  outputs = document.querySelectorAll("output");
for (var index = 0; index < outputs.length; index++) {
  var args = JSON.parse(inputs[index].value);
  outputs[index].innerHTML = multDiv(args)
}
function multDiv(n) {
  var r = 0,
    n = Array.isArray(n) ? n : Array.prototype.slice.call(arguments);
  n.forEach(function(_, i, array) {
    if (i % 2 === 0) {
      if (array[i + 1]) {
        if (r === 0) {
          r = array[i] * array[i + 1];
        } else {
          r *= array[i + 1]
        }
      }
    } else {
      if (array[i + 1]) {
        r /= array[i + 1]
      }
    }
  });
  return r
}
<fieldset>
  <input value="[4, 3, 2]" id="a" />result:
  <output for="a"></output>
  <br />
  <input value="[2, 1, 1, 6, 3, 2]" id="b" />result:
  <output for="b"></output>
</fieldset>