Используя Рамду, как ты сочиняешь против бинарных функций? - PullRequest
0 голосов
/ 27 ноября 2018

Рамда обеспечивает регистрозависимые равные R.equals, однако я хочу тест на равенство без учета регистра.Рамда также предоставляет R.compose, но в композиции Рамды предполагается, что левый крайний аргумент является унарным.

Я хочу сделать что-то вроде

R.compose( R.equals(...), R.toLower )

Но я хочусоставьте R.toLower для двоичной функции R.equals?

Есть ли способ сделать это?Типы лайков

(b->b->c) -> (a->b) => (a->a->c)

Что я хочу, это что-то вроде Data.Function.on на Haskell, которое определяется как

on b u x y, запускает двоичную функцию b нарезультаты применения унарной функции u к двум аргументам x и y.С противоположной точки зрения, он преобразует два входа и объединяет выходы.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Существует также eqBy, который вы можете рассмотреть:

Принимает функцию и два значения в своей области и возвращает true, если значения отображаются на одно и то жезначение в кодомене;иначе false.

R.eqBy(R.toLower, 'a', 'A'); //=> true

Пример:

console.log(R.eqBy(R.toLower, 'a', 'A'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.0/ramda.min.js"></script>
0 голосов
/ 27 ноября 2018

РЕДАКТИРОВАТЬ: 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);
...