我在Java语言中有此代码:
const R = require('ramda')
const f1 = () => 4
const f2 = () => 5
const f3 = value => value + 1
R.pipe(
f1,
f2,
f3,
console.log
)() // output = 6
出于某种原因,我需要在f3()上由f1()产生的值。
我该怎么做?
谢谢。
不能完全确定您要在这里完成什么,但是一种可能的方法是将选择器函数与f2
一起使用,您可以用来控制f2的返回值。传递给f2
的函数将返回5
或前一个值。在这里,我使用了带有标识函数(R.always
)的K组合器(R.always
)来定义此函数,但是您可以将其解释为(R.identity
为R.identity
)。如果要使该函数具有以前的行为并返回一个全新的值,则可以改用K(I)
。
x => y => y
f2(K)
我改变了对问题思考的方式。
我以为:如果f3()需要f1()和f2()的某个值,为什么不在f3上明确指出呢?
我已经注意到,为此仅使用管道是不正确的选择。
我搜索了Ramda文档并找到了converge函数。
这解决了我的问题(从原始问题中编辑):
const f1 = () => 4;
const f2 = sel => prev => sel(5)(prev);
const f3 = value => value + 1;
const K = R.always; // x -> * -> x
R.pipe(
f1, // => 4
f2(K(R.identity)), // => 4 (if f2(K) used, then f2(K) => 5)
f3, // => 4 + 1 = 5
console.log // IO
)(); // 5