从一个未柯里化的函数组成一个函数
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.
更清晰易读
我正在尝试创建一个可柯里函数 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
我可能仍会使用 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.