Прежде всего, это ошибка в вашем [оригинале, неотредактированный] вопрос:
ч = е. г эквивалентна ч х = г (е) х
- это не так: h = f . g
эквивалентно h x = f (g x)
.
Однако, почему это так, а не наоборот, это, скорее всего, потому, что так оно работает и работает в математике; см http://en.wikipedia.org/wiki/Function_composition:
[...] композит функция обозначается г ∘ F: X → Z, определяется (г ∘ е) (х) = G (F (х)) для всех x в X.
Это также интуитивное из равенства (f . g) x == f (g x)
- как вы можете видеть, порядок f
и g
является одинаковым с обеих сторон.
Кроме того, тривиально создать свой собственный оператор «обратной композиции», если вы желаете его по причинам, например. читаемость:
(.>) = flip (.)
так что
Prelude> ((+1) .> (*2)) 3
8
Prelude> ((+1) . (*2)) 3
7
В самом деле, вы можете просто использовать Control.Arrow.(>>>)
, который делает то же самое для функций, но является более общим и работает для других вещей:
Prelude Control.Arrow> ((+1) >>> (*2)) 3
8
Я думаю, что вы немного смущены, '.' является правильным ассоциативным, но' h = f. g' действительно эквивалентно 'h x = f (g x)': 'h = (* 3). (+2) '. 'h 2' дает' 12', как вы ожидали бы, если '(+2)' будет оцениваться до – berdario
Кроме того, ассоциативное свойство имеет смысл, если у вас более 1 операции (и, следовательно, более 2 операндов): https : //en.wikipedia.org/wiki/Associative_property – berdario
Почему 'hx = f (gx)', а не 'hx = g (fx)' не является вопросом ассоциативности композиции, а скорее как операнды к ' . обрабатываются. Вопрос об ассоциативности был бы следующим: 'f. г . h' анализируется как f. (g. h) ', а не' (f. g). h', но на самом деле композиция полностью ассоциативна и обе скобки правильны. Композиция такая же, как и добавление в этом смысле. – chepner