When choosing a programming language, people want quick and easy answers.

"Python is the best for AI"
"Kotlin is the best for Android"
"Swift is the best for iOS"
"C++"
"JavaScript is the best for frontend"

Promoting language like OCaml is challenging because they don't have that (yet).

Instead, OCaml has a compounding effect.

1. Blazing fast compile times result in fast feedback loops and higher productivity
2. Type inference means that static typing is not obnoxious. You can make PoCs fast. You can evolve code more easily.
3. ADTs allow you to prevent classes of errors and manage complexity
4. HOFs allow you to express intentions faster
5. Parametric polymorphism reduces boilerplate
6. Macros aka PPX generate even more boilerplate for you
7. Pattern matching helps with capturing relevant code paths in your logic.

And so on.

People are really bad at compounding, so it's hard to promote this as a feature.

What's even worse, negative compounding is also a thing (and for some reason people understand this type of compounding really well).

Poor tooling and a small ecosystem don't play in your favour.

Killer App/Killer Feature/Killer Use Case is a cheat that increases language adoption despite all its horrible shortcomings.

A more sustainable way to grow a language is to address papercuts one by one. It's not easy and requires endurance.