Ramda Converge 导致函数错误

Ramda Converge causing error with arity of function

我认为我对 converge 的工作方式有一个合理的处理,但我一直在盯着这个问题和它的批评者(对我来说),错误消息有点,似乎没有任何东西跳出来在我身上。

最小示例

const first = pipe(   
  inc,
  num => compose(multiply(num), multiply(num))
)(9)(1);
console.log("First: ", first);

const second = pipe(
  inc,
  converge(compose, [multiply, multiply])
)(9)(1);
console.log("Second: ", second);

输出:

First: 100
Error: First argument to _arity must be a non-negative integer no greater than ten

您对 converge 的理解可能非常接近。这当然是可以理解的尝试。

这里的问题是,当 converge 运行时,它会创建一个新函数,该函数将调用每个转换函数,然后将这些结果传递给主函数。这个return函数的元数是那些转换函数的最大元数。

因此converge (compose, [multiply, multiply])大致等同于curry ((a, b) => compose (multiply (a, b), multiply (a, b)),因为multiply的元数是2。但这意味着 compose 在我们已经收到两个被乘数之前不会被调用。

您可以通过更改您提供的乘法函数来改变它。这有效:

pipe (
  inc,
  converge (compose, [mult, mult])
) (9) (1)

有了这个:

const mult = (a) => (b) => a * b

或者这个:

const mult = unary (multiply)

或者这个:

const mult = uncurryN (1, multiply)

我担心 Ramda 神奇的柯里化虽然经常有用,但偶尔也会导致这样的问题。如果我们推出 1.0 版,我将尝试说服 Ramda 团队的其他成员在下一个版本中切换到简单柯里化。或者也许那是完全不同的图书馆。

Ramda 也迫切需要处理其错误消息。

总有一天。