Передать список функций в pipe или создать в Ramda.js - PullRequest
0 голосов
/ 27 марта 2019

О функциях, которые принимают несколько аргументов.

В частности, я предполагаю "труба" и "сочинять". Они принимают несколько функций в качестве аргументов.

В настоящее время я хочу передать им список нескольких функций.

В Ramda.js Обычно:

const piped = R.pipe(R.inc, R.negate);

Я хочу вот так:

const funcs = [R.inc, R.negate];
const piped = R.pipe(funcs);

Я также подумываю о передаче списка частично примененных функций

const funcs = [R.add (1), R.pow (2)];

Функции в этих списках не имеют свойства name. Поэтому мне было интересно, можно ли найти решение, связав эти функции Рамдайса и частично примененные функции к переменным. Но они не казались такими умными.

Это мой первый опыт использования английского языка и переполнения стека. И мне жаль на уродливом английском, потому что это механический перевод. Как я могу решить эту проблему, пожалуйста, сообщите мне решение. Спасибо.

Ответы [ 2 ]

1 голос
/ 27 марта 2019

То, что вы на самом деле хотите, - это свернуть список функций с помощью комбинбатора обратной композиции (он же контравариантный функтор):

const inc = x => x + 1;
const sqr = x => x * x;

const reduce1 = f => xs =>
  xs.reduce(f);
  
const contra = (g, f) => x =>
  f(g(x));

console.log(
  reduce1(contra) ([inc, inc, inc, sqr]) (1)); // 16

Это работает только для непустых массивов. Нам нужна складка с аккумулятором, чтобы сделать частично примененную складку reduce1(contra) полной функцией:

const inc = x => x + 1;
const sqr = x => x * x;
const id = x => x;

const reduce = f => acc => xs =>
  xs.reduce(f, acc);
  
const contra = (g, f) => x =>
  f(g(x));
  
const pipen = reduce(contra) (id);

console.log(
  pipen([inc, inc, inc, sqr]) (1)); // 16

console.log(
  pipen([]) (1)); // 1

В Ramda использование R.apply вполне нормально. Но учтите, что эта функция специфична для Рамды.

0 голосов
/ 27 марта 2019

Ramda.js - это обычные функции javascript, поэтому доступны методы Function.call и Function.apply.

Таким образом, решение вашей проблемы заключается в использовании.apply метод применения нескольких аргументов (которые являются списком):

пример:

const funcs = [R.inc, R.negate];
const piped = R.pipe.apply(R, funcs);

Существует также Ramda.apply (который выможно проверить в документации Ramda), но собственный метод Function.apply решает проблему элегантно и оригинально ( note в соответствии с документацией pipe function нет упоминаний об использовании определенногоконтекст, как и для некоторых других функций в Ramda документации).

Ответ на комментарий:

R.apply имеет те же проблемы со связанным контекстом, что и нативный *Метод 1032 * имеет (согласно документация Ramda ).Таким образом, проблема контекста метода apply в основном не имеет значения и имеет второстепенное значение.

...