在Ramda管道中使用相同的第一个参数
Using the same first argument in a Ramda pipe
是否可以在Ramda中组成以下函数?
(a, b) => R.pipe(func1(a), func2(a))(b)
目的是将参数a
传递给pipe
中的所有函数。
我最初的想法是:
R.pipe(R.juxt([func1, func2]), R.apply(R.pipe))
但这给出了CCD_ 5。
使用S.pipe
更容易表达这一点,因为它需要函数的数组来组合。
一种选择是使用R.ap
:
> S.pipe(R.ap([S.add, S.mult, S.add], [3]), 10)
42
另一种选择是将R.map
与画眉组合子S.T
一起使用:
> 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
您必须创建所有函数的当前版本,然后用a
调用每个函数的当前版,最后在R.pipe
或R.reduce
中使用b
假设需要以a
作为第一个自变量的函数是f,g,h
(按特定顺序),那么我们希望实现以下表达式
h(a, g(a, f(a, b)))
首先,让我们创建一个curried函数,它接收两个参数,一个值v
和一个函数fn
,当这个函数接收到所有必需的参数时,它将简单地返回fn(v)
const rev = R.curry((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 solver = (a, b) => R.compose.apply(undefined, R.map(R.compose(rev(a), R.curry), [h,g,f]))(b)
const add = (a, b) => a + b
const sub = (a, b) => a - b
const mul = (a, b) => a * b
const rev = R.curry((v, fn) => fn(v))
const solver = (a, b) => R.compose.apply(undefined, 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(solver(2, 3))
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.21.0/ramda.min.js"></script>
相关文章:
- 抛出消息;TypeError:第一个参数必须是字符串或Buffer
- AngularFire 0.5美元移除.错误:Firebase.child失败:第一个参数是无效路径
- Node.js如何知道回调的第一个参数是否是错误处理程序
- 未能构造'Blob':提供的第一个参数为null,或者是无效的Array对象
- 什么's将数组传递给app.get()的第一个参数的替换项
- node.js请求POST数组“;第一个参数必须是字符串或缓冲区;
- fn.apply 与第一个参数 null 或未定义
- JS中的文本函数第一个参数(_)
- 为什么.replace 方法使用正斜杠字符将第一个参数括起来
- 要传递给 fn.apply 的标准默认第一个参数
- 为什么node.js在回调中寻找错误作为第一个参数
- 下划线.js : _.where() 使用第一个参数,但不适用于第二个参数
- 添加新的第一个参数,然后应用原始参数
- 对 $scope.$watch 的第一个参数的混淆
- Firebase.update失败:第一个参数在属性中包含未定义的参数
- 为什么setTimeout和setInterval's回调第一个参数
- 为什么 Math.max.apply 不关心第一个参数
- 如何在javascript中从url获取第一个参数
- 函数.调用类似数组的对象,不需要第一个参数
- 对setTimeout中的第一个参数感到困惑