Here be dragons
The Haskell wiki explains function composition as
the act of pipelining the result of one function to the input of another, creating an entirely new function
and that seems relatively easy to wrap one’s mind around.
It’s just the associativity that confused me initially .
In Haskell, I defined two simple functions
times3 = (*3) plus1 = (+1)
which I could compose and apply to
2 to yield
(plus1 . times3) 2
which is “effectively” equivalent to
plus1 (times3 2)
which demonstrates the piping idea in a manner more palatable to my brain.
The type of the composition operator
(.) is defined as
$(\beta \to \gamma) \to (\alpha \to \beta) \to \alpha \to \gamma$
which I dumb down to
- two operands, each being funtions, are composed to produce a new function $\alpha \to \gamma$
- compositions are processed from the rightmost function towards the left
therefore one may state that, regardless how many compositions are chained
- the output type of the leftmost operand (in our simplified expression above, function $\beta \to \gamma$) dictates the return type of the resulting function (or composition) so I guess it makes sense to state that the leftmost function sits at the end of the pipe.
- the rightmost function represents the first function that will be applied