4

I'm trying to create a curriable function that returns whether or not the supplied length is equal to the length of the supplied string. I'd like it to work like this:

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

I initially tried this, but the argument order is reversed because it returns the curried equals function:

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

I can fix by wrapping it in a function like this:

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

But it seems like there would be a way to use the functional library to solve this. Anyone have any ideas?

4

2 回答 2

2

最简单的方法是使用flip您找到的那个函数 - 不幸的是,为了正常工作,我们需要添加一个对组合函数进行 uncurrying 的阶段:

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
于 2016-02-08T00:55:41.260 回答
1

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

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

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

这绝对比useWith解决方案更干净,更容易阅读。您可以在Ramda REPL中看到这一点。

于 2016-02-08T02:37:38.703 回答