Typescript 重构`f(g(x))(x)`这样我就可以很好地编写这个了
我有几个函数,目前是这样写的(以抽象形式)Typescript 重构`f(g(x))(x)`这样我就可以很好地编写这个了,typescript,functional-programming,lodash,function-composition,Typescript,Functional Programming,Lodash,Function Composition,我有几个函数,目前是这样写的(以抽象形式) const someFunction = x => f(g(x))(x); i、 e 将x传递到g以获得输出 然后将该输出传递到f以获得函数 然后将x传递到该函数中 由于嵌套的方括号、真实的函数名以及x等的多次使用,它感觉有点笨拙 我一直在使用lodash/fp,我的第一个想法是.flow,但最后我仍然必须将x传递到流的输出中 嗯。。。除非我颠倒f中参数的顺序,否则我可以 const someFunction = x => _.flow(
const someFunction = x => f(g(x))(x);
i、 e
x
传递到g
以获得输出f
以获得函数
x
传递到该函数中
x
等的多次使用,它感觉有点笨拙
我一直在使用lodash/fp
,我的第一个想法是.flow
,但最后我仍然必须将x
传递到流的输出中
嗯。。。除非我颠倒f
中参数的顺序,否则我可以
const someFunction = x => _.flow(g, f(x))(x);
我认为这会起作用,因为f(x)
会将x
传递到f
中以取出函数。然后这个\流(g,f(x))(x)
将x
传递到g
中,然后将其输出传递到从f
返回的结果curried函数中
不过还是很笨重。不完全满意。有没有其他更优雅/更易读的方法可以推荐。多亏@Ori\u Drori的输入,我创建了一个函数
const chain = _.curry((f, g, x) => f(g(x))(x));
然后我的代码开始是
const myOldFunction = (x) => f(g(x))(x);
变成
const myAwesomeNewFunction = chain(f, g);
这使得它更具可读性,并将其转化为一个只需一个输入的函数,这意味着我可以使其无需指向,然后将其很好地放入我的其余函数中。“这行得通吗?”-你可以测试一下,而不是让我们帮你做。这更像是一个反问句,用来提示其他解决方案。我把它拿走了。我没有要求任何人帮我测试。过于急切地触发快乐mods结束问题。这仍然是一个有效的问题<代码>.\u0.flow()不适用于这种情况。创建一个arrow函数并将其转换为curry-
const chain=u.curry((f,g,x)=>f(g(x))(x))
你的感觉是对的,你正在做一些事情。f(g(x))(x)
模式实际上是FP中最著名的模式之一的实例。函数类型的链
/绑定
/平面映射
,是类型形成单子代数所需的术语之一。应用版本是f(x)(g(x))
,由于flip=f=>y=>x=>f(x)(y)
,因此与前者相当。但是,这对您没有多大帮助,因为lodash、AFAIK中没有monad/应用程序支持。您需要一个与fantasy land兼容的库来获取monad机制。我们通常不使用原始函数类型作为monad实例,而是使用名为Reader
的包装类型。不幸的是,我不推荐lib。幻想世界的小伙子们创造了一个想法。问题是单子并不容易,因为你不能单独使用它们。它们的行为是系统性的,也就是说,如果你要一个monad,你会得到很多不同类型的monad实例和变压器来组成它们,我想这不是你想要的。。