3

Функция композиции составляет справа налево:Почему композиция композиции сочиняется справа налево в 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 

Есть ли причины, по которым композиция функции идет справа налево?

+0

"* Таким образом, функции оцениваются в обратном порядке их применения *" - да, что? – Bergi

+0

Вы, кажется, спрашиваете, почему аргументы (справа) оцениваются перед вызовом функции (слева), нет? – Bergi

+0

Было бы более полезно, если бы 'seq' был написан' comp (comp (dec) (sqr)) (inc) '? (функциональный состав является коммутативным) – Bergi

ответ

3

Ваш вопрос на самом деле о порядке аргументов в определении оператора композиции функций, а не о праве-лево-ассоциативности. В математике мы обычно пишем «f o g» (эквивалентно comp (f) (g) в вашем определении), чтобы означать функцию, которая принимает x и возвращает f (g (x)). Таким образом, «f o (g o h)» и «(f o g) o h» эквивалентны, и обе означают функцию, которая отображает каждый аргумент x в f (g (h (x))).

При этом мы иногда пишем f; g (что эквивалентно compl (f) (g) в вашем коде) означает функцию, которая отображает x в g (f (x)). Таким образом, обе (f; g); h и f; (g; h) означают функцию, отображающую x в h (g (f (x))).

Ссылка: https://en.wikipedia.org/wiki/Function_composition#Alternative_notations

+0

Хорошо, я путаю коммутативный с ассоциативным законом. Благодаря! – ftor

+0

Что касается альтернативных обозначений («;»): мы также находим «трубные» операторы типа '>>>' или '|>', которые лучше визуализируют концепцию «слева направо», ИМО. – phg

6

Чтобы ответить на исходный вопрос: Почему функция композиции сочинить справа налево?

  1. Так традиционно сделан в математике
  2. comp(f)(g)(x) имеет тот же порядок, как f(g(x))
  3. Это тривиально, чтобы создать обратную или вперед композицию (пример)

Форвард функции Состав:

const flip = f => x => y => f(y)(x); 
const comp = f => g => x => f(g(x)); 
const compl = flip(comp); 

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

comp(sqr)(inc)(2); // 9 
compl(sqr)(inc)(2); // 5 

flip имеет в т его уважение ограничения, что переворачивается композиция не может быть объединена с самими собой, чтобы сформировать «более высокий состав заказа»:

const comp2 = comp(comp)(comp); 
const compl2 = compl(compl)(compl); 
const add = x => y => x + y; 

comp2(sqr)(add)(2)(3); // 25 
compl2(sqr)(add)(2)(3); // nonsense 

Заключение: Права налево заказ традиционный/обычным, но не интуитивно.

 Смежные вопросы

  • Нет связанных вопросов^_^