Я реализую функцию, которая выполняет следующий абстрагированный по деталям поиск, для которого работает этот пример реализации:
// 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, и если да, может ли другая функция Ramda послужить мне лучше? («Лучше» означает так же кратко, даже если написано на ES5, но все же доступно другим программистам.)



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ты делаешь это правильно. Единственная проблема в том, что используемая вами версия REPL:
равно 0.17.1, а документация, которую вы читаете, относится к самой последней версии 0.25.0.
Вы можете увидеть проблему, если посмотрите исходный код. В версии 0.17.1 использовать с начинается с:
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 будет передан как массив, во втором аргументе, а не как список параметров. См. источник:
module.exports = _curry2(function useWith(fn, transformers) {
return curry(_arity(transformers.length, function() {
// ...
Изменение, похоже, связано, в частности, с Эта проблема.
Итак, либо обновитесь до более новой версии Ramda, либо используйте useWith, передав функции как отдельные параметры, а не как массив. Ваш код работает должным образом в версии 0.18.0+.
Я даже не заметил, что использую старую версию REPL, и очень рад, что включил эту ссылку. Оказывается, в реальном проекте у меня другая проблема с pipeP.