Получить предыдущее значение трубопровода в Рамде - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть этот код в Javascript:

const R = require('ramda')

const f1 = () => 4
const f2 = () => 5
const f3 = value => value + 1

R.pipe(
    f1,
    f2,
    f3,
    console.log    
)()   // output = 6

По какой-то причине мне нужно значение, полученное с помощью f1 () для f3 ().

Как я могу это сделать ?

Спасибо.

Ответы [ 2 ]

1 голос
/ 08 февраля 2020

Я передумал о том, как я думал о проблеме.

Я подумал: если f3 () нужно какое-то значение из f1 () и f2 (), почему бы не указать это явно в f3?

Я заметил, что использовать только трубу для этого было неправильным выбором.

Я искал в документах Ramda и нашел функцию конвергенции.

Это решило мою проблему (отредактировано от исходного вопроса):

const R = require('ramda')

const f1 = () => 4
const f2 = () => 5
const f3 = (v1, v2) => v1 + v2

R.pipe(
    R.converge(f3, [f1, f2]),
    console.log
)() // output 9
0 голосов
/ 08 февраля 2020

Не совсем уверен, что вы пытаетесь выполнить sh здесь, но одним из возможных способов может быть использование функции выбора с f2, которую вы можете использовать для управления тем, что возвращает f2. Функция, которую вы передаете в f2, либо возвращает 5, либо предыдущее значение. Здесь я использовал K-комбинатор (R.always) с функцией тождества (R.identity) для определения этой функции, но вы можете интерпретировать ее как (K(I) будучи x => y => y). Если вы хотите, чтобы функция вела себя так, как раньше, и возвращала совершенно новое значение, вы можете использовать f2(K).

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
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.27.0/ramda.js" integrity="sha256-buL0byPvI/XRDFscnSc/e0q+sLA65O9y+rbF+0O/4FE=" crossorigin="anonymous"></script>
...