Функция композиции составляет справа налево:Почему композиция композиции сочиняется справа налево в Javascript?
const comp = f => g => x => f(g(x));
const inc = x => x + 1;
const dec = x => x - 1;
const sqr = x => x * x;
let seq = comp(dec)(comp(sqr)(inc));
seq(2); // 8
seq(2)
преобразуется в dec(sqr(inc(2)))
и порядок приложение inc(2)...sqr...dec
. Таким образом, функции вызывается в обратном порядке, в котором они передаются в comp
. Это не является интуитивно понятным для Javascript программистов, так как они используются для метода построения цепочки, которая идет слева направо:
o = {
x: 2,
inc() { return this.x + 1, this },
dec() { return this.x - 1, this },
sqr() { return this.x * this.x, this }
}
o.dec().sqr().inc(); // 2
я считаю, что сбивает с толку. Вот обратная композиция:
const compl = f => g => x => g(f(x));
let seql = compl(dec)(compl(sqr)(inc));
seql(2); // 2
Есть ли причины, по которым композиция функции идет справа налево?
"* Таким образом, функции оцениваются в обратном порядке их применения *" - да, что? – Bergi
Вы, кажется, спрашиваете, почему аргументы (справа) оцениваются перед вызовом функции (слева), нет? – Bergi
Было бы более полезно, если бы 'seq' был написан' comp (comp (dec) (sqr)) (inc) '? (функциональный состав является коммутативным) – Bergi