We use it in production at Olo, and I used it in production at my last company.
Since learning F#, languages where if statements aren't expressions and that don't have option types feel broken to me =)
The lightweight type structure where you can easily make Union types and the pattern matching are pretty much identical to how OCaml does it.
Of course, the big difference is going to be in how easily you can interop with the .Net stuff in each language, obviously much easier in F#. This is great if you happen to have some kind of weird C# code that generates an IEnumerable, just pop that into F# and start working with it.
For example, I have C# classes to read files to an IEnumerable of strings, you can just call List.ofSeq on it, and then start doing some really elegant things in F# with it. You can pattern match log files based on how the line starts and then run different functions whether it’s an error, info, debug, etc
Basically, if you do use F#, be aware that it has its own idioms that you must learn; it's not a drop-in replacement for e.g. OCaml/Haskell/etc.
The syntax is very similar but it solves many of Ocaml's pain points and you will get better tooling and more libraries thanks to .Net.
All of those either remove pain points (some of them arguably very small) or introduce improvements that are sensible in day to day life.
With that and the fast that Ocaml and F# can (for the most part) easily be transpiled into one another, nowadays I see very little reason not to use F#.
That being said, I find the fact that you basically never need explicit types in Ocaml very elegant (in F# the uniform syntax mean that you will need occasional types hints to disambiguate operations).
Are you referring to F#'s computation expressions? If so, OCaml has a similar-in-power let-syntax now: http://jobjo.github.io/2019/04/24/ocaml-has-some-new-shiny-s...
> Ocaml and F# can (for the most part) easily be transpiled into one another,
Actually they can't. They are quite different languages in practice.
Its true that you can't literaly transpile very high order things such as GADT but the was majority of code is trivial to translate as both syntax and available constructs match.
I practice, I found translations between the two languages to be fairly easy (the same cannot be said for most language pairs).
(I was not aware of the new let-syntax, thats a nice addition (although computation expression did not make my list as they are more of an enabler for library authors than normal users). I will dig in to see what people build around it...)
Oh cool, I'd forgotten F# had those (or maybe it got them recently?).
> Its true that you can't literaly transpile very high order things such as GADT but the was majority of code is trivial to translate
Would still have to disagree there; OCaml code heavily relies on modules/module types/functors, while F# code relies more on classes. In practice these are not trivially translateable.
> I will dig in to see what people build around it...
The major thing is getting an async/await-like syntax for concurrent operations. Super useful for literally everyone. E.g. my project https://github.com/yawaramin/re-web/blob/eb7ce8474d34c60f9f9...