Я слежу за статьей о преобразователях в JavaScript, и, в частности, у меня есть определены следующие функции
const reducer = (acc, val) => acc.concat([val]);
const reduceWith = (reducer, seed, iterable) => {
let accumulation = seed;
for (const value of iterable) {
accumulation = reducer(accumulation, value);
}
return accumulation;
}
const map =
fn =>
reducer =>
(acc, val) => reducer(acc, fn(val));
const sumOf = (acc, val) => acc + val;
const power =
(base, exponent) => Math.pow(base, exponent);
const squares = map(x => power(x, 2));
const one2ten = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
res1 = reduceWith(squares(sumOf), 0, one2ten);
const divtwo = map(x => x / 2);
Теперь я хочу определить оператор композиции
const more = (f, g) => (...args) => f(g(...args));
и я вижу, что он работает в следующих случаях
res2 = reduceWith(more(squares,divtwo)(sumOf), 0, one2ten);
res3 = reduceWith(more(divtwo,squares)(sumOf), 0, one2ten);
которые эквивалентны
res2 = reduceWith(squares(divtwo(sumOf)), 0, one2ten);
res3 = reduceWith(divtwo(squares(sumOf)), 0, one2ten);
Весь скрипт онлайн.
Я не понимаю, почему я не могу объединить последнюю функцию (sumOf
) с оператором композиции (more
). В идеале я хотел бы написать
res2 = reduceWith(more(squares,divtwo,sumOf), 0, one2ten);
res3 = reduceWith(more(divtwo,squares,sumOf), 0, one2ten);
но это не работает.
Изменить
Понятно, что моя первоначальная попытка была ошибочной, но даже если я определяю композицию как
const compose = (...fns) => x => fns.reduceRight((v, fn) => fn(v), x);
Я до сих пор не могу заменить compose(divtwo,squares)(sumOf)
на compose(divtwo,squares,sumOf)
...
является не оператор! - person Felix Kling   schedule 17.05.2017(a,b,c,d, etc...) => a(b(c(d(etc...))))
- person   schedule 17.05.2017...
еще не оператор ;) - person Felix Kling   schedule 17.05.2017map
преобразователь:map = f => g => x => y => g(x) (f(y))
. Когда вы применяетеmap
к композиции функцийcomp = f => g => x => f(g(x))
, кажется, чтоcomp
может составлять более двух функций, потому чтоx
— это просто еще одна функция.comp
вместе с составными преобразователями создают стек преобразователей, который затем оценивается сверху вниз (и, следовательно, композиция выполняется слева направо). Эта способностьcomp
называется абстракцией над арностью и представляет собой продвинутый материал функционального программирования. - person   schedule 17.05.2017more
имеет только два параметра функцииf
иg
, которые будут вложены друг в друга, как вы ожидаете, что она волшебным образом будет работать с большим количеством аргументов? - person Bergi   schedule 17.05.2017const compose = (...fns) => x => fns.reduceRight((v, fn) => fn(v), x);
я не могу написатьcompose(divtwo,squares,sumOf)
вместоcompose(divtwo,squares)(sumOf)
- person   schedule 17.05.2017compose
всегда нужно возвращать функцию — например,(...args) => …
из вашегоmore
. Вашreduce
этого не делает. - person Bergi   schedule 17.05.2017