However, I would still choose Haskell or OCaml over it for virtually any project
This might be off-topic, but I've been thinking about learning one of these two. Can you give me any advice on which to learn first (or which to use for what)?
For OCaml, check out http://ocaml.org for examples and tutorials. There's also http://try.ocamlpro.org where you can actually try some things out without the hassle of installing. OPAM [1] is new package manager for OCaml which, makes dealing with the libraries a lot easier (gotten v popular quite quickly) - it's available via homebrew which made it v convenient for me.
Also, it's worth being aware of the differences between the languages e.g. Haskell is purely functional whereas OCaml allows imperative and OO.
I'm learning OCaml (slowly), and may have a look at Haskell later on. People I'm working with view OCaml as a much more pragmatic language than Haskell, in terms of building real world systems (e.g. Mirage [2]). However, people make cool things in Haskell too, e.g. pandoc [3]
My experience with modern statically typed languages have been primarily with ML and OCaml.
While they have a lot of advantages over neanderthal languages like C, and it's great that once you've gotten your program to compile, whole classes of bugs will be virtually impossible, I much prefer programming in Scheme.
With ML and OCaml, I really hated spending hours wrestling with the compiler and puzzling over obscure error messages that seem to require taking college level courses in type theory in order to understand.
In comparison, programming in Scheme (and even Common Lisp) is incredibly quick and easy, and a real joy.
True, when I need maximal robustness, I do wind up spending a lot more time writing unit tests in Scheme than I would in ML or OCaml. But for rapid prototyping and programming as I think, Scheme is very hard to beat.
I think the best way to see the benefit of languages with static type systems is when you work in large team projects.
I do like to use languages with dynamic type systems when doing quick prototypes or small programs on my own, but I wouldn't dare to advice doing our multi-site enterprise projects in such a language.
Specially given how lax offshore teams write unit tests, if ever.
At least with static type languages the product does run. If it does what is required is another matter.
Well, I'm a little biased, but I would learn Haskell. It's the one I learned first--in fact, I learned it during my very first college CS course. (The course, coincidentally, was in Scheme.) If I managed it as a freshman, it can't be all that difficult :P.
Haskell has a couple of very good freely available books: Learn You a Haskell[1] and Real World Haskell[2]. I also found Write Yourself a Scheme in 48 Hours[3] very helpful. When I was learning OCaml, I could not find any terribly good resources. That said, it wasn't much of an issue, so I didn't look too hard--learning OCaml after knowing Haskell is very easy. There is going to be a Real World OCaml book at some point, but I think it's still a work in progress.
I also think Haskell is good because it's more of a departure from languages you're probably used to. You can't sink back into your old habits, because everything is done completely differently. Of course, some people find it helpful to have less of a departure from what they're used to, so perhaps you might prefer OCaml because it's less different from normal languages.
I use Haskell for my own projects (and, this semester, for research), and I used OCaml for an internship this summer. I think that for most tasks, they're roughly equally suited. If you want to do multicore concurrent or parallel code, I think Haskell has the edge, but I have not really done much of that in either language.
OCaml has a very good JavaScript compiler called js_of_ocaml[4]. While Haskell does have some options for JavaScript as well like Fay[5] or UHC[6], I don't think it's quite as nice. I used js_of_ocaml during my internship and was very happy with it. So for web stuff, I'd probably go for OCaml. Both OCaml and Haskell have good backend web frameworks, but I haven't really used any of them.
If you happen to be on windows, installing OCaml is a pain. Haskell, with the Haskell Platform[7] should be much easier, but I haven't tried it myself.
OCaml has a really good Emacs mode called typerex[8]. Haskell has some alternatives like ghc-mod[9] and scion[10], but I've never been able to get them to work. Admittedly, typerex was not easy to install either.
Ultimately, you wouldn't go wrong with either one. Moreover, the core ideas are fairly transferable between the two: you'll find that learning OCaml after Haskell or Haskell after OCaml is relatively easy. I would lean towards Haskell, but it's not a big deal.
I just realized that I've written a whole bunch of paragraphs to say very little: either language is a great choice and I just happen to like Haskell more. Hopefully this is not too much of a deluge of information :P.
OK, I'm curious now. Wikipedia says[1] the reference implementation is open-source and cross-platform, which is great, but I never hear of anyone talking about F# outside the Microsoft world.
The compiler has to be compiled from source[2] on Ubuntu, which seems to suggest hardly anyone is using it.
Would there be any compelling reason to use F# if you're not working in a primarily Microsoft environment? What does the language itself offer over Ocaml or Haskell?
From what I understand F# works on mono and the F# MS team actually puts in effort to make sure it does. Though for whatever reason mono just isn't that good at running F# code. Maybe it is a weak GC or lack of ability to optimize the code patterns F# produces, I don't know. It is slower than F# on CLR.
Given that, library access and ability to thread are the two big things it is going to have over Ocaml. Cleaner syntax when compared to Ocaml too. Haskell, not much.
This might be off-topic, but I've been thinking about learning one of these two. Can you give me any advice on which to learn first (or which to use for what)?