From my point of view, the main distinguishing feature for f# is Statically Resolved Type Parameters. It’s a feature you don’t want to see in business code (same as reflection in c#), but something that enables libraries to take f# to the next level. Compare this to type classes in Haskell and what is called functors in OCaml.
Personally most of the pain points have been in dealing with .net core.
Microsoft.Extensions.Optionsrequires ceremony to use.
These are minor things. For the most part I don’t need dependency injection heavy code in the f# I’ve been writing.
Comments or errors? Fork this post and do a pull request on github