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