Numbers could be composed (combined) by addition (or multiplication which is merely a repeated addition). But numbers does not exist, while the Universe does.
Composition in this particular Universe (out of which an abstract composition has been generalized by a mind of an observer) is indeed "concrete".
For compound structures, such as molecules or proteins, it is "structural chemical bonds" - having a structure is the essential principle. This is, by the way, why the Lisp and its List Structure, which has a distinct spine of conses was (and is) such a big deal. Is a basic (minimal and sufficient) structure of the Nature.
The composition of procedures (enzymes, other semi-independent cellular components) is done via Nesting which is a Universal Principle. This is why closures is such a big deal.
Functions in any programming language, which is an abstract notion, generalized out of "procedures" (enzymes) and formalized as a mathematical function (we have to go from concrete Nature to abstract Math and back to The Middle Path of programming and applied philosophy all the time!) shall be composed only via proper nesting, which, you see, connects the "pure" call-by-need semantics to The Ultimate Reality (of molecular biology).
Closures in CS are "independent", "complete" procedures which, at least in theory, have the properties of abstract mathematical functions and very concrete enzymes. This is why referential transparency is a must have.
The composition of sounds (which have pitch (frequency), duration and volume), which we call Music, is done by "concatenation" or literally "putting together (adjoining) in a sequence". However, it could be imagined that notes are nested, and each note is embedded in each other and the music unfolds. Different sounds could (and usually do) overlap (happen simultaneously) and this is how one composes a symphony.
The way the Universe a single one process (of nested sub-processes) is unfolding.