Why is `compose` right to left?

I've been working my way through the excellent Mostly Adequate Guide to Functional Programming recently. Although I've been working with compose for a bit now, I needed to review why it operates from right-to-left (also known as "right associative"). A review of mathematical theory will help answer this question.

Function Composition

The image above is read as "g ∘ f", or "g composed with f", or "g-compose-f". For example, (g ∘ f )(c) = #. If we change 'c' to 'x', this function would read as g(f(x)). As you'll remember from high school algebra and composite functions, this means you plug in something for 'x', then plug that value into 'f', then plug that value into 'g'. This evaluation occurs from right to left, hence why compose is right associative.

To illustrate compose, consider the following:

f(x) = 2x + 2 and g(x) = –x + 3, find (g o f)(1)

Solution:

(g o f)(1) = g(f(1))
f(1) = 2(1) + 2 = 4
g(4) = -4 + 3 = -1 (remember, 4 was return value of f(1))

...and -1 is our answer from this function composition.

Left to Right

Developers don't always think in right-to-left fashion, so if you want the reverse pipe (or sequence depending on the library), is an alternative to compose that operates from left-to-right.