The nicest surprises so far have been:
- I can code in a fully dynamically typed manner for the parts of my code where it's more convenient. (To do this in O'Caml requires manual wrappers and/or some camlp4 magic.)
- A nice set of sequence comprehensions and syntax for it, built-in.
The big downside is that there's no attempt whatsoever to unify the .NET-centric OO language model and the O'Caml functional language model: You're stuck alternating between writing code in C#-with-some-type-inference or in O'Caml.
(If you want that unified model: Look at scala.)
The most important annoyance is that you often need to explicitly upcast objects. For example if you have a String and a function that takes Object you need to upcast the String to Object.
update: To answer my own question, I asked him, and he responded: http://twitter.com/aChrisSmith/status/21929022794
I love the internet.