从未计算的函数中编写函数

时间:2016-02-08 00:50:06

标签: javascript functional-programming ramda.js

我试图创建一个curriable函数,返回所提供的长度是否等于提供的字符串的长度。我希望它像这样工作:

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

我最初尝试过这个,但参数顺序相反,因为它返回了curry equals函数:

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

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

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

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

2 个答案:

答案 0 :(得分:2)

最简单的方法是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

答案 1 :(得分:1)

来自answerBergi正是我建议的无点解决方案。但正如经常看到的那样,不应该使用无点数。当它使事情更清楚时,一定要使用它。在ES6之前,这是相当普遍的。胖箭头和其他更清晰的语法再次让平衡回归。

我仍然可以用Ramda的curry函数来编写这个,因为它提供了一些额外的灵活性:

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

这比useWith解决方案更清晰,更易于阅读。您可以在 the Ramda REPL 中看到这一点。