I don’t know what level of understanding you’re looking for. But I’ll answer the title of your post, rather than the questions themselves. Though in a way, it also answers #1
(1) The “ML programming style” is based on “well-founded induction”, and also on the idea (“value-oriented programming”) of never modifying data, but instead taking it part (via induction) and constructing new data. This is what unifies both Ocaml/SML and Haskell. Ocaml/SML go further, and allow modifying data, but even so, most ML code adheres to this discipline.
(2) To really understand OCaml, I think it would be useful to read and understand three things:
(a) The Hindley-Milner type inference algorithm
(b) Xavier Leroy’s Master’s thesis The ZINC Experiment: An Economical Implementatoin of ML
© read and understand The Little MLer
This is a starting-point. I think that another good place to look to really understand well the idea of induction, and its centrality to “thinking in ML” is to read and understand Gerard Huet’s paper The Constructive Engine where he teaches you how to view lambda-terms as objects on which one can perform induction, but in a manner that respects alpha-conversion. It. Is. A. Tour. De. Force.
(3) But perhaps you’re looking for something more … surface. In which case, I’d suggest Yaron Minsky’s Real World Ocaml
(4) Ok, now to your question #2: Really, it can be used in all these areas. I would suggest that basically, ML (and hence, OCaml) can be used as a work-alike for C++, where you’re trying to decrease programmer investment while maintaining code-quality.
In short, the thing that would make me choose C++ over Ocaml, is that I need something that is -screamingly- fast, and/or exploits multicore. And I’m willing to do the extra work to implement it, b/c it’ll be a LOT HARDER to implement in C++ than in Ocaml.
For most things, if you don’t need crazy performance or multicore scalability (which sometimes you can get via multiple processes) the only reason to not choose Ocaml is that you also don’t care about correctness.
So here’s another way of thinking of it: I program in three languages:
#1 perl when I need the program NOW, and it’s not too terribly complex
#2 Ocaml when I need the program SOON, and it’s really complex
#3 C++ when I need the program to run like the wind, and I’m OK with it taking a while, and with limitations on the complexity of the problem I can address.