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
而不是 pipe
或 compose
:
// 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 自己创建的函数 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));
我有创建范围的函数:
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
而不是 pipe
或 compose
:
// 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 自己创建的函数 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));