重构 `f(g(x))(x)` 以便我可以很好地组合它
Refactor `f(g(x))(x)` so that I can compose this nicely
我有几个函数是这样写的(以抽象形式)...
const someFunction = x => f(g(x))(x);
即
- 将
x
传递给 g
以获得输出。
- 然后将该输出传递给
f
以获得 function
。
- 然后将
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);
这使它更具可读性,并将它变成了一个具有单一输入的函数,这意味着我可以让它成为自由点,然后将它很好地放入我的其余函数中。
我有几个函数是这样写的(以抽象形式)...
const someFunction = x => f(g(x))(x);
即
- 将
x
传递给g
以获得输出。 - 然后将该输出传递给
f
以获得function
。 - 然后将
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);
这使它更具可读性,并将它变成了一个具有单一输入的函数,这意味着我可以让它成为自由点,然后将它很好地放入我的其余函数中。