我有创建范围的函数:
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)
我想要相同但范围在上面
答案 0 :(得分:3)
要使用包含多个参数的函数进行组合,请多次使用组合-尽管您需要使用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);
要提供curried函数的最后一个参数,最简单的Ramda解决方案是使用a placeholder:
// stepRange: Number -> Number -> Number -> [Number]
// range: Number -> Number -> [Number]
const range = stepRange(R.__, R.__, 1);
,但这仅适用于Ramda自己的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));