使用Ramdajs的无点管道范围

时间:2018-07-03 17:33:05

标签: functional-programming ramda.js pointfree

我有创建范围的函数:

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
)

管道,总和和范围是我的实现。

但是我不确定如何做到无指向性。

请注意,范围是返回函数的函数,以便于使用。

range(0)(10)(1) 

谢谢

更多描述:

想象一下我有计数和分割功能。 这是常规功能:

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

这是没有意义的样式(imag

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

我想要相同但范围在上面

1 个答案:

答案 0 :(得分:3)

要使用包含多个参数的函数进行组合,请多次使用组合-尽管您需要使用R.o而不是pipecompose

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

要提供curried函数的最后一个参数,最简单的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));