F#, barring .NET interop, seems quite simpler than, say C#. (Not really picking on it in particular, but since it's another popular .NET language...)
Take F# functions, for instance:
- There's no magic "void" type-thats-not-really-a-type
- Hence everything is an expression
- All functions are unary
- Functions are first class type
Right there you have a function system that's vastly easier than, say, C#, where void creates a special case, and there's no generalization possible over all functions.
As to your specific question, with "let f x = x" versus "let f = fun x -> x", that's probably an inherited trait from ML. (I don't see any particular reason why it couldn't be "let f = fun x = x", except that perhaps it'd be more confusing and perhaps make the grammar more complex?. (Personally I'd prefer "let f = \x.x".)) Anyways, while in most cases they are equivalent, sometimes you must define a syntactic function instead of a function value.
.NET interop can, unfortunately, make things a bit more complicated, although probably not more or much more than other .NET languages.