Javascript 在Ramda管道中使用相同的第一个参数
是否可以在中编写以下函数Javascript 在Ramda管道中使用相同的第一个参数,javascript,ramda.js,Javascript,Ramda.js,是否可以在中编写以下函数 (a,b)=>R.pipe(func1(a),func2(a))(b) 目标是将参数a传递给管道中的所有函数 我最初的想法是: R.pipe(R.juxt([func1,func2]),R.apply(R.pipe)) 但是这会产生TypeError:无法读取未定义的的属性“length”您必须创建所有函数的当前版本,然后使用a调用每个函数的当前版本,最后在R.pipe或R.reduce中使用b 假设需要将a作为第一个参数的函数是f,g,h(按特定顺序),那么我们想要实
(a,b)=>R.pipe(func1(a),func2(a))(b)
目标是将参数a
传递给管道中的所有函数
我最初的想法是:
R.pipe(R.juxt([func1,func2]),R.apply(R.pipe))
但是这会产生TypeError:无法读取未定义的的属性“length”您必须创建所有函数的当前版本,然后使用a
调用每个函数的当前版本,最后在R.pipe
或R.reduce
中使用b
假设需要将a
作为第一个参数的函数是f,g,h
(按特定顺序),那么我们想要实现以下表达式
h(a, g(a, f(a, b)))
首先,让我们创建一个curried函数,它接收两个参数,一个值v
和一个函数fn
,当这个函数接收到所有必需的参数时,它将返回fn(v)
接下来,我们可以使用R.map
和R.curry
// note the reversed order of the functions
// I'll use R.compose instead of R.pipe
let curriedVersion = R.map(R.curry, [h,g,f])
然而,我们还需要使用a
作为curried函数的第一个参数,我们可以使用R.map
调用a
的每个curried函数,但我们将使用特殊函数rev
const curriedVersion = R.map(R.compose(rev(a), R.curry), [h,g,f])
最后,让我们将这个curried函数数组与R.compose
和b
const result = R.compose.apply(undefined, curriedVersion)(b)
一个衬垫(用于按特定顺序排列的功能f、g、h
):
const add=(a,b)=>a+b
常数sub=(a,b)=>a-b
常数mul=(a,b)=>a*b
const rev=R.curry((v,fn)=>fn(v))
常量解算器=(a,b)=>R.compose.apply(未定义,R.map(R.compose(rev(a),R.curry),[mul,sub,add]))(b)
//mul(2,sub(2,add(2,3)))
//mul(2,sub(2,5))
//mul(2,-3)
// -6
console.log(解算器(2,3))
这更易于表达,因为它需要一系列函数来组合
一种选择是使用:
另一个选项是与画眉组合器一起使用:
> S.pipe(R.map(S.T(3), [S.add, S.mult, S.add]), 10)
42
然后,您可以将其中一个封装在lambda中,以创建一个二进制函数:
const f = (a, b) => S.pipe(R.ap([S.add, S.mult, S.add], [a]), b);
f(3, 10); // add(3)(mult(3)(add(3)(10)))
// => 42
我建议使用而不是R.compose.apply(未定义,…)
。谢谢,我的答案是:R.pipe(R.of,R.ap([R.assoc('b'),R.assoc('c'))),R.apply(R.pipe))(2)({a:1}/={a:1,b:2,c:2}
> S.pipe(R.ap([S.add, S.mult, S.add], [3]), 10)
42
> S.pipe(R.map(S.T(3), [S.add, S.mult, S.add]), 10)
42
const f = (a, b) => S.pipe(R.ap([S.add, S.mult, S.add], [a]), b);
f(3, 10); // add(3)(mult(3)(add(3)(10)))
// => 42