在Ramda中获取管道的先前值

问题描述 投票:0回答:2

我在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()产生的值。

我该怎么做?

谢谢。

javascript functional-programming ramda.js
2个回答
0
投票

不能完全确定您要在这里完成什么,但是一种可能的方法是将选择器函数与f2一起使用,您可以用来控制f2的返回值。传递给f2的函数将返回5或前一个值。在这里,我使用了带有标识函数(R.always)的K组合器(R.always)来定义此函数,但是您可以将其解释为(R.identityR.identity)。如果要使该函数具有以前的行为并返回一个全新的值,则可以改用K(I)

x => y => y
f2(K)

0
投票

我改变了对问题思考的方式。

我以为:如果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
© www.soinside.com 2019 - 2024. All rights reserved.