Functional Programming in OCaml is an online book compiled by Michael R. Clarkson. It is used by Cornell University for their functional programming course.
I enjoyed reading chapter one. They explain the goals and purpose of the class that the book supports. It also has a great section on the history of the book and the course. It tells how the class was originally based on Structure and Interpretation of Computer Programs, (SICP). From the challenges of teaching SICP, they changed languages, from Scheme to OCaml, and they developed the textbook from their class notes. This is fascinating because it is a similar experience that lead to the development of Racket and the supporting book How To Design Programs. I will probably talk more about how SICP, a beloved textbook, lead to the creation of other books in a future entry.
Chapter 2 is an introduction to OCaml as a language. I have read a number of tutorials and several chapters on other OCaml books, and "Functional Programming in Ocaml" seems to be one of the clearest explanations on the basics of OCaml. If for some reason you didn't understand the topic well enough from this text, at the end of the chapter the authors tell you which chapters from others OCaml books you should read to get an alternate explanation of the same topics.
There is a caveat to the previous statement. It will be clear if you have a basic understanding on lambda calculus and you are familiar with how modern mathematics defines concepts. If you are not familiar with these, the text should be more challenging.
The exercises for chapter 2 were good. You get to face the difference between integer operators such as +, -, * , /, versus the floating point operators, like +., -., * . / ..