Ramdajs 的无点管道范围

Point-free pipe range with Ramdajs

我有创建范围的函数:

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 是 return 更容易柯里化的函数。

range(0)(10)(1) 

谢谢

更多描述:

假设我有计数和拆分功能。 这是常规函数:

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

这是无点样式(imag

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

我想要相同但范围高于

要与接受多个参数的函数组合,请多次使用组合 - 尽管您需要使用 R.o 而不是 pipecompose:

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

要提供柯里化函数的最后一个参数,最简单的 Ramda 解决方案是使用 a placeholder:

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

但这只适用于 Ramda 自己创建的函数 curryNcurry,不适用于手动柯里化的函数。有了这些,你只能 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));