I've had experience with both Scala and OCaml (both which allow non-functional programming also). F# is the Microsoft version of OCaml.<p>Scala is easier to learn if you know Java, and has excellent IDE support in both Eclipse and Intellij IDEA. "Programming in Scala" is a good introduction and reference for Scala (<a href="http://www.artima.com/shop/programming_in_scala" rel="nofollow">http://www.artima.com/shop/programming_in_scala</a>), but doesn't cover the new features in Scala 2.8.<p>I had good experiences with OCaml also (which compiles down to machine code, so has the potential to be faster than Scala if performance is critical). I believe it has more advanced tail-recursion optimizations. It seemed that floating point arithmetic was slow because each number had to be stored on the heap separately.
My preference is for erlang. I believe it is the only one that does concurrency "right", though I don't know the others well enough to prove it. Any blocking, as in transactional memory or locks is, in my opinion, a real concurrency problem.<p>As I learned erlang and OTP I kept finding design choices I really appreciated.<p>The pragmatic programmers book on erlang was written by the creator of the language and I think is one of the better programming books ever. Clearly he's spent several decades teaching this language to perplexed students, cause he found the right way to illuminate it.