Everything composes - particles (or shall we say localized energy) into atoms, atoms into molecules, molecules into amino acids, aminoacidos into proteins and enzymes, etc.
To make sure that the compositions are consistent we need Types
For functions composition is just nesting.
f . g = \x -> f (g x)
Nesting of functions is the only way to establish (ensure) the evaluation order in a pure-functional lazy language.
\x -> \y -> x + y
is an implicit function composition.
sequence  = return  sequence (a:as) = do x <- a xs <- sequence as return (x:xs)
desugars into nothing but a function composition.
sequence  = return  sequence (a:as) = a >>= \x -> sequence as >>= \xs -> return (x:xs)