Точечный ряд труб с Ramdajs - PullRequest
0 голосов
/ 03 июля 2018

У меня есть функция, которая создает диапазоны:

const range = from => to => step => ....

И я хочу создать другую функцию, которая будет делать что-то с этим диапазоном, но я хочу использовать трубу.

Например, я хочу получить сумму диапазона.

const sum = ...

const getSum = pipe(
    range(),
    sum,
)

Я могу к следующему:

  const getSum = from => to => {
       return sum(range(from)(to)(1))
    }

Но могу ли я сделать это с ramdajs и быть свободным от очков?

Например:

const getSum = pipe(
   range..///here,
   sum
)

pipe, sum и range - мои реализации.

Но я не уверен, как это сделать без очков.

Обратите внимание, что диапазон - это функция, которая возвращает функцию для облегчения карри.

range(0)(10)(1) 

Спасибо

Подробнее:

Представьте, что у меня есть функции подсчета и разделения. Это обычная функция:

 const numChars = str => count(split('', str))

Это стиль без точек (imag

const numChars = pipe(split(''), count)

хочу того же, но с диапазоном выше

1 Ответ

0 голосов
/ 05 июля 2018

Чтобы создать композицию с функцией, которая принимает более одного аргумента, используйте композицию несколько раз - хотя вам нужно использовать R.o вместо pipe или compose:

// sum: [Number] -> Number
// range: Number -> Number -> [Number]
// getSum: Number -> Number -> Number
const getSum = R.o(R.o(R.sum), R.range);

Чтобы предоставить последний аргумент карри функции, самое простое решение Ramda использует заполнитель :

// stepRange: Number -> Number -> Number -> [Number]
// range: Number -> Number -> [Number]
const range = stepRange(R.__, R.__, 1);

, но это работает только с функциями, созданными собственными curryN или curry Рамды, а не с функциями с карри в ручном режиме. С ними вы можете только R.flip, пока не сможете частично применить первый аргумент:

// stepRange: from -> to -> step -> range
// flip(stepRange): to -> from -> step -> range
// o(flip, stepRange): from -> step -> to -> range
// flip(o(flip, stepRange)): step -> from -> to -> range
// range: from -> to -> range
const range = R.flip(R.o(R.flip, stepRange))(1);

Я действительно не могу рекомендовать это делать. Все возможно, но это нечитаемо. Просто запишите параметры:

const getSum = R.o(R.o(R.sum), R.flip(R.o(R.flip, stepRange))(1));
// vs
const getSum = from => to => R.sum(stepRange(from)(to)(1));
...