Functional programming 带Ramdajs的无点管道范围

Functional programming 带Ramdajs的无点管道范围,functional-programming,ramda.js,pointfree,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)

我有创建范围的函数:

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)


我也希望如此,但对于上述范围,若要使用包含多个参数的函数进行组合,请多次使用组合-尽管需要使用而不是
管道
组合

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

要提供curried函数的最后一个参数,最简单的Ramda解决方案是使用:

但这仅适用于拉姆达自己的
curryN
curry
创建的函数,而不适用于手动curry函数。对于这些函数,您只能在部分应用第一个参数之前:

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

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

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

要提供curried函数的最后一个参数,最简单的Ramda解决方案是使用:

但这仅适用于拉姆达自己的
curryN
curry
创建的函数,而不适用于手动curry函数。对于这些函数,您只能在部分应用第一个参数之前:

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

如果你的
range
是完全咖喱化的,那么
pipe
将只能向它传递一个参数。但是我没有引用参数和函数:pipe(range,{here},…)“是返回函数以便于咖喱化的函数吗”?我想你的意思是“是一个咖喱化的函数以便于部分应用”。是的,正确,但我不知道如何使用两个或更多参数进行管道,因为getSum也需要两个参数。或者最好不要使用无点函数如果
范围
完全符合要求,那么
管道
将只能向其传递一个参数。但我没有对参数和函数的引用:管道(范围,{here},…“返回函数的函数是否更容易实现”?我想你的意思是“返回函数的函数是否更容易实现部分应用”是的,正确,但我不知道如何使用两个或更多参数,因为getSum也使用两个参数。或者最好不要使用无点函数hh,现在我看到了答案,我真的理解了问题!啊,现在我看到了答案,我真的理解了问题!