重构 `f(g(x))(x)` 以便我可以很好地组合它

Refactor `f(g(x))(x)` so that I can compose this nicely

我有几个函数是这样写的(以抽象形式)...

const someFunction = x => f(g(x))(x);

  1. x 传递给 g 以获得输出。
  2. 然后将该输出传递给 f 以获得 function
  3. 然后将 x 传递给 function

由于嵌套的括号、真实世界的函数名称以及 x 等的多次使用,感觉有点笨拙...

我一直在使用 lodash/fp,我的第一个想法是 _.flow,但最后我仍然必须将 x 传递到流的输出中。

嗯...除非我颠倒f中参数的顺序然后我可以做...

const someFunction = x => _.flow(g, f(x))(x);

我认为这会起作用,因为 f(x) 会将 x 传递给 f 以获取函数。然后这个 _.flow(g, f(x))(x) 会将 x 传递给 g,然后将它的输出传递给从 f.

返回的结果柯里化函数

虽然它仍然很笨重。对此并不完全满意。是否有另一种更 elegant/more 可读的方法可以建议。

感谢@Ori_Drori 的帮助,我创建了一个函数...

const chain = _.curry((f, g, x) => f(g(x))(x));

然后我的代码开始为...

const myOldFunction = (x) => f(g(x))(x);

变成了...

const myAwesomeNewFunction = chain(f, g);

这使它更具可读性,并将它变成了一个具有单一输入的函数,这意味着我可以让它成为自由点,然后将它很好地放入我的其余函数中。