F# changes to OCaml
This question has been answered for some time now, but I was quite surprised that most of the answers say what OCaml features are missing in F# - this is definitely good to know if you want to port existing OCaml programs to F# (which is probably the motivation of most of the referenced articles). However, there are many features that make F# a different language (not just a limited version of OCaml for .NET!) Here is a couple of things that are added in F#:
- Units of measure that allow you to type-check code dealing with numerical calculations
- Meta-programming using quotations (which makes it possible to use LINQ in F# and is also essential for promissing projects like the WebSharper platform)
- Active patterns for creating abstractions for functional data types (and generally very useful feature for more complicated pattern matching applications)
- Computation expressions which is a language feature behind asynchronous workflows (a library for asynchronous I/O/web service/GUI programming)
- .NET compatible object-system that makes it possible to fully interoperate with the .NET platform (OCaml also has a support for objects but different - there are of course some benefits in both of the systems).
- Overloaded operators - As far as I know, OCaml doesn't have overloaded operators - in F# you can use
+
for all numeric types as well as your types that support it.
And, honestly, I think that it is also worth mentioning the Visual Studio IDE. This is not a part of the language, but it really improves the user experience (IntelliSense support in Visual Studio is really good!)
If you look at the list, there are many things that largely contributed to the popularity of F#, so it's much more than just "OCaml without functors". F# is definitely based on OCaml (and takes ideas from other languages such as Haskell) and shares many aspects with them, however there is also a lot of other things. I guess that without things like asynchronous workflows, .NET style OO and meta-programming, the Microsoft Developer Division would never include F# in Visual Studio 2010.
The main differences are that F# does not support:
- functors
- OCaml-style objects
- polymorphic variants
- the camlp4/5 preprocessor or extension points (ppx)
In addition, F# has a different syntax for labeled and optional parameters.
In theory, OCaml programs that don't use these features can be compiled with F#. Learning OCaml is a perfectly reasonable introduction to F# (and vice versa, I'd imagine).
The complete list of differences is here (note: archive.org replacement of dead link).