РЕДАКТИРОВАТЬ: R.useWith
очень близко подходит к тому, что вы ищете:
Принимает функцию fn и список функций преобразователя и возвращает новую функцию карри,Когда вызывается новая функция, она вызывает функцию fn с параметрами, состоящими из результата вызова каждого предоставленного обработчика для последовательных аргументов новой функции.
Таким образом, вы можете определить свою функцию следующим образом:
const equalsi = R.useWith(R.equals, [R.toLower, R.toLower]);
Пример:
const equalsi = R.useWith(R.equals, [R.toLower, R.toLower]);
const check = (a, b) => console.log(`${a} = ${b}?`, equalsi(a, b));
check('aaa', 'aaa');
check('aaa', 'aa');
check('aAa', 'aaa');
check('aaa', 'aAa');
check('aba', 'aaa');
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.0/ramda.min.js"></script>
Если вы хотели что-то эквивалентное функции Haskell on
, которую вы упомянули, вы можете определить ее следующим образом:
const on = (b, u) => R.useWith(b, [u, u]);
const equalsi = on(R.equals, R.toLower);
const check = (a, b) => console.log(`${a} = ${b}?`, equalsi(a, b));
check('aaa', 'aaa');
check('aaa', 'aa');
check('aAa', 'aaa');
check('aaa', 'aAa');
check('aba', 'aaa');
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.0/ramda.min.js"></script>
Предыдущий ответ :
Может быть более элегантный способ сделать это, но это работает:
const equalsi = R.unapply(R.compose(
R.apply(R.equals),
R.map(R.toLower)
));
Разбить его:
// [] -> Boolean
// Takes an array of two strings and returns true if they are equal
R.apply(R.equals)
// [] -> Boolean
// Takes an array of two strings, converts them to lowercase, and returns true
// if those lowercase strings are equal
R.compose(R.apply(R.equals), R.map(R.toLower))
// String -> String -> Boolean
// Takes two strings, converts them to lowercase, and returns true if those lowercase
// string are equal
R.unapply(R.compose(R.apply(R.equals), R.map(R.toLower)));
Вы также можете определить свою функцию on
в терминах функций Ramda, а затем использовать это:
const on = (b, u) => R.unapply(R.compose(R.apply(b), R.map(u));
const equalsi = on(R.equals, R.toLower);