【问题标题】:Reverse arguments order in curried function (ramda js)咖喱函数中的反转参数顺序(ramda js)
【发布时间】:2018-07-12 20:18:05
【问题描述】:

我有一个高阶函数:为了简单起见

const divideLeftToRight = x => y => x/y;

我想要一个执行除法但从“右到左”的函数。换句话说,我需要:

const divideRightToLeft = x => y => y/x;

我想过做:

const divideRightToLeft = R.curry((x,y) => divideLeftToRight(y)(x));

我想知道是否有更优雅的方法来做到这一点

【问题讨论】:

    标签: functional-programming ramda.js


    【解决方案1】:

    您正在寻找flip function:

    const divideRightToLeft = R.flip(divideLeftToRight)
    

    【讨论】:

    • 翻转不适用于我的高阶函数(除非可能是 tweeking)。 ramdajs.com/repl/… 如果我的函数是: const divideLeftToRight = (x,y) => x/y;那么参数的翻转就可以了
    • flip 是否可以与 ramda 本身 curried 的函数一起使用(不是通过嵌套箭头函数)?
    • @Bergi:不完全是。它翻转任何(arity 2+)函数的前两个参数。 (x, y) => x/y 可以正常工作。或者,或者,可以将flipuncurryN 一起使用。但它不知道如何处理 arity-1 函数。
    • @ScottSauyet 不能只是假设它是咖喱吗? flip = f => f.length == 1 ? ((x) => (y, ...args) => f(y)(x, ...args)) : …
    • @Bergi:我们可能可以。我记得以前没有出现过,但这样做是有道理的。我们需要比这更复杂的东西,因为结果可能看起来像其他 Ramda 函数的输出,有几种不同的调用方式(fn(y)(x)fn(y, x),但这是一个细节
    【解决方案2】:

    您可以在翻转之前对函数进行 uncurry。 (flip 返回一个柯里化函数。)

    例如

    const divideRightToLeft = R.flip(R.uncurryN(2, divideLeftToRight))
    

    或者,您可以定义一个自定义flipCurried 函数:

    // https://github.com/gcanti/fp-ts/blob/15f4f701ed2ba6b0d306ba7b8ca9bede223b8155/src/function.ts#L127
    const flipCurried = <A, B, C>(fn: (a: A) => (b: B) => C) => (b: B) => (a: A) => fn(a)(b);
    
    const divideRightToLeft = flipCurried(divideLeftToRight)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多