Ramda的useWith的使用方法
How to use Ramda's useWith
我正在实现一个执行以下详细抽象搜索的函数,此示例实现适用于此:
// findRecord :: id → [{id: number}] → {id: number}|null
const findRecord = R.curry((id, list) => R.find(R.propEq('id', id), list));
findRecord(1, [{id: 1}]); // {id: 1}
我正在尝试使用 useWith
( https://ramdajs.com/docs/#useWith ):
来实现该方法
// findRecord :: id → [{id: number}] → {id: number}|null
const findRecord = R.useWith(R.find, [R.propEq('id'), R.identity]);
findRecord(1, [{id: 1}]); // Error('r[u] is not a function')
我哪里错了?我是不是误解了 useWith
的 signature/usage,如果是这样的话,另一个 Ramda 函数会更好地为我服务吗? ("Better" 意思是即使用 ES5 编写也同样简洁,但对于其他程序员来说仍然可以合理地访问。)
你做得对。唯一的问题是您使用的 REPL 版本:
是 0.17.1,而您正在阅读的文档是针对最新版本 0.25.0。
看源码就知道问题了,在0.17.1中,useWith开头是:
module.exports = curry(function useWith(fn /*, transformers */) {
var transformers = _slice(arguments, 1);
var tlen = transformers.length;
// ...
也就是说,transformer
函数应该是 纯参数 ,跟在初始 fn
之后,例如 R.useWith(R.find, R.propEq('id'), R.identity);
。如果你像那样使用 useWith
,那么在你的 0.17.1 REPL 版本中,它将按预期工作:
const findProject1 = R.useWith(R.find, R.propEq('id'), R.identity);
findProject1(1, [{id:1}, {id: 2}]);
输出:
{"id": 1}
但在 0.18.0 及更高版本中,transformers
应作为数组在第二个参数 中传递 ,而不是作为参数列表传递.见 the source:
module.exports = _curry2(function useWith(fn, transformers) {
return curry(_arity(transformers.length, function() {
// ...
变化似乎源于 this issue,等等。
因此,要么升级到更新版本的 Ramda,要么使用 useWith
通过将函数作为单独的参数而不是数组传递。您的代码在 0.18.0+ 中按预期工作。
我正在实现一个执行以下详细抽象搜索的函数,此示例实现适用于此:
// findRecord :: id → [{id: number}] → {id: number}|null
const findRecord = R.curry((id, list) => R.find(R.propEq('id', id), list));
findRecord(1, [{id: 1}]); // {id: 1}
我正在尝试使用 useWith
( https://ramdajs.com/docs/#useWith ):
// findRecord :: id → [{id: number}] → {id: number}|null
const findRecord = R.useWith(R.find, [R.propEq('id'), R.identity]);
findRecord(1, [{id: 1}]); // Error('r[u] is not a function')
我哪里错了?我是不是误解了 useWith
的 signature/usage,如果是这样的话,另一个 Ramda 函数会更好地为我服务吗? ("Better" 意思是即使用 ES5 编写也同样简洁,但对于其他程序员来说仍然可以合理地访问。)
你做得对。唯一的问题是您使用的 REPL 版本:
是 0.17.1,而您正在阅读的文档是针对最新版本 0.25.0。
看源码就知道问题了,在0.17.1中,useWith开头是:
module.exports = curry(function useWith(fn /*, transformers */) {
var transformers = _slice(arguments, 1);
var tlen = transformers.length;
// ...
也就是说,transformer
函数应该是 纯参数 ,跟在初始 fn
之后,例如 R.useWith(R.find, R.propEq('id'), R.identity);
。如果你像那样使用 useWith
,那么在你的 0.17.1 REPL 版本中,它将按预期工作:
const findProject1 = R.useWith(R.find, R.propEq('id'), R.identity);
findProject1(1, [{id:1}, {id: 2}]);
输出:
{"id": 1}
但在 0.18.0 及更高版本中,transformers
应作为数组在第二个参数 中传递 ,而不是作为参数列表传递.见 the source:
module.exports = _curry2(function useWith(fn, transformers) {
return curry(_arity(transformers.length, function() {
// ...
变化似乎源于 this issue,等等。
因此,要么升级到更新版本的 Ramda,要么使用 useWith
通过将函数作为单独的参数而不是数组传递。您的代码在 0.18.0+ 中按预期工作。