Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 重构`f(g(x))(x)`这样我就可以很好地编写这个了_Typescript_Functional Programming_Lodash_Function Composition - Fatal编程技术网

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实例和变压器来组成它们,我想这不是你想要的。。