F #, за исключением взаимодействия .NET, кажется гораздо проще, чем, скажем, C #. (На самом деле не особо на этом разбираюсь, но так как это еще один популярный язык .NET ...)
Взять функции F #, например:
- Там нет волшебного "пустого" типа, который не действительно тип
- Следовательно, все является выражением
- Все функции одинарные
- Функции первого класса
Здесь у вас есть система функций, которая намного проще, чем, скажем, C #, где void создает особый случай, и обобщение всех функций невозможно.
Что касается вашего конкретного вопроса, то "let f x = x" против "let f = fun x -> x", это, вероятно, унаследованная черта от ML. (Я не вижу какой-либо конкретной причины, почему это не может быть «let f = fun x = x», за исключением того, что, возможно, это будет более запутанным и, возможно, сделает грамматику более сложной? let f = \ xx ".)) В любом случае, хотя в большинстве случаев они эквивалентны, иногда вы должны определить синтаксическую функцию вместо значения функции.
.NET-взаимодействие, к сожалению, может усложнить ситуацию, хотя, вероятно, не намного и не намного больше, чем другие языки .NET.