Диапазон безточечных труб с Ramdajs

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

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

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

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

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))

Это бесточечный стиль (воображение

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

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


person user2693928    schedule 03.07.2018    source источник
comment
Если ваш range полностью каррирован, то pipe сможет передать ему только один параметр.   -  person Scott Sauyet    schedule 03.07.2018
comment
Но у меня нет ссылки на параметр и функцию: pipe (range, {here}, ...)   -  person user2693928    schedule 04.07.2018
comment
это функция, которая возвращает функцию для упрощения каррирования? Я думаю, вы имеете в виду, что это каррированная функция для более легкого частичного применения.   -  person Bergi    schedule 04.07.2018
comment
Да, правильно, но я не знаю, как передавать по конвейеру с двумя или более аргументами, поскольку getSum также принимает 2 аргумента. Или, может быть, лучше не быть бесточечной функцией   -  person user2693928    schedule 04.07.2018


Ответы (1)


Чтобы составить с функцией, принимающей более одного аргумента, используйте композицию несколько раз - хотя вам нужно использовать _1 _ вместо 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 Ramda, а не с каррированными вручную функциями. С ними вы можете только 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));
person Bergi    schedule 05.07.2018
comment
Ах, теперь, когда я вижу ответ, я действительно понимаю вопрос! - person Scott Sauyet; 05.07.2018