Я думаю, что большинство важных моментов уже были упомянуты кем-то другим:
- F # позволяет решать задачи так, как математики думают о них
- Благодаря функциям более высокого порядка вы можете использовать более простые концепции для решения сложных задач
- По умолчанию все является неизменным, что облегчает понимание программы (а также распараллеливание)
Определенно верно, что вы можете использовать некоторые концепции F # в C # 3.0, но есть ограничения. Вы не можете использовать никакие рекурсивные вычисления (потому что C # не имеет хвостовой рекурсии), и именно так вы пишете примитивные вычисления функциональным / математическим способом. Кроме того, написание сложных функций более высокого порядка (которые принимают другие функции в качестве аргументов) в C # затруднительно, потому что вы должны писать типы явно (в то время как в F # типы выводятся, но также автоматически обобщаются, поэтому вам не нужно явно создавать универсальная функция).
Кроме того, я думаю, что следующее замечание Марка Гравелла не является обоснованным возражением:
С точки зрения обслуживания, я считаю, что подходящие имена свойств и т. Д. Легче использовать (в течение полного жизненного цикла), чем кортежи и списки заголовок / хвост, но это может быть только я.
Это, конечно, правда. Тем не менее, отличительной особенностью F # является то, что вы можете начать писать программу с использованием кортежей и списков заголовков и хвостов, а затем в процессе разработки превратить ее в программу, которая использует .NET IEnumerables и типы со свойствами (и я так думаю, типичный F # программист работает *). Кортежи и т. Д., А также интерактивные инструменты разработки F # дают вам отличный способ быстро создавать прототипы решений (и когда вы делаете что-то математическое, это важно, потому что большая часть разработки просто экспериментирует, когда вы ищете лучшее решение). Получив прототип, вы можете использовать простые преобразования исходного кода для переноса кода в тип F # (который также можно использовать из C # как обычный класс). F # также дает вам много способов оптимизировать код позже с точки зрения производительности.
Это дает вам преимущества простых в использовании языков (например, Python), которые многие люди используют на этапе создания прототипа. Однако вам не нужно переписывать всю программу позже, когда вы закончите создавать прототипы с использованием эффективного языка (например, C ++ или, возможно, C #), потому что F # «прост в использовании» и «эффективен», и вы можете свободно переключаться между этими двумя стилями.
(*) Я также использую этот стиль в моей книге функционального программирования .