从一个未柯里化的函数组成一个函数

Composing a function from an uncurried function

我正在尝试创建一个可柯里函数 returns 无论提供的长度是否等于提供的字符串的长度。我希望它像这样工作:

checkLength(3)('asdf') // => false
checkLength(4)('asdf') // => true

我最初尝试过这个,但是参数顺序是相反的,因为它 returns 柯里化 equals 函数:

const checkLength = R.compose(R.equals(), R.prop('length'))
checkLength('asdf')(4)

我可以通过将其包装在这样的函数中来修复:

const checkLength = (len) => R.compose(R.equals(len), R.prop('length'))

但似乎有办法使用函数库来解决这个问题。有人有什么想法吗?

最简单的方法是 flip 您找到的那个函数 - 遗憾的是要正常工作,我们需要添加一个对组合函数进行解柯里化的阶段:

const checkLength = R.flip(R.uncurryN(2, R.compose(R.equals, R.prop('length'))))
checkLength(4)('asdf') // => true

另一种解决方案是使用 useWith 函数:

const checkLength = R.useWith(R.equals, [R.identity, R.prop('length')]);
checkLength(4)('asdf') // => true

from Bergi 正是我要建议的免积分解决方案。但正如我们经常看到的那样,不应该为了自己的利益而使用无积分。当它使事情变得更清楚时,一定要使用它。在 ES6 之前,这很常见。粗箭头和其他更简洁的语法再次打破平衡。

我可能仍会使用 Ramda 的 curry 函数来编写此代码,因为它提供了一些额外的灵活性:

const checkLength = curry((len, str) => str.length === len);
checkLength(3)('abcd'); //=> checkLength(3, 'abcd'); //=> false

这绝对比 useWith solution. You can see this at work in the Ramda REPL.

更清晰易读