When did I say “function composition”? What I said is “composing solutions to smaller, more tractable problems”. If you divide a problem `FooBarQux` into a sequence of subproblems, `Foo`, `Bar` and `Qux`, sure, these solutions must be combined using the function composition operator. But there are other ways to decompose problems. For instance, splitting a problem into a DAG of subproblems with overlapping dependencies gives rise to dynamic programming.<p>And, no, an ML-like module system wouldn&#x27;t make up for the lack of first-class functions. Standard ML doesn&#x27;t allow any module recursion whatsoever, and, while OCaml allows it, it&#x27;s quite unwieldy to use in practice. It would be literally impossible to define a function like `fix`, which requires the ability to call its function argument (let&#x27;s call it `f`), supplying an expression containing `fix` itself as argument.