Многие другие ответы были сосредоточены на производительности (параллелизме) функционального программирования, что, я считаю, очень важно. Тем не менее, вы специально спросили о производительности, так как вы можете программировать то же самое быстрее в функциональной парадигме, чем в императивной парадигме.
На самом деле (из личного опыта) я обнаружил, что программирование на F # соответствует тому, как я думаю лучше, и поэтому это проще. Я думаю, что это самая большая разница. Я программировал как на F #, так и на C #, и в F # гораздо меньше «борьбы с языком», что мне нравится. Вам не нужно думать о деталях в F #. Вот несколько примеров того, что я нашел, мне действительно нравится.
Например, даже если F # статически типизирован (все типы разрешаются во время компиляции), вывод типов определяет, какие типы у вас есть, поэтому вам не нужно это говорить. И если он не может понять это, он автоматически делает вашу функцию / класс / что-то общее. Таким образом, вам никогда не придется писать какие-либо общие, все это автоматически. Я считаю, что это означает, что я трачу больше времени на размышления о проблеме и меньше на ее решение. Фактически, всякий раз, когда я возвращаюсь к C #, я обнаруживаю, что действительно скучаю по этому выводу типа, вы никогда не понимаете, насколько это отвлекает, пока вам больше не нужно это делать.
Также в F # вместо написания циклов вы вызываете функции. Это небольшое изменение, но существенное, потому что вам больше не нужно думать о конструкции цикла. Например, вот фрагмент кода, который должен пройти и сопоставить что-либо (я не могу вспомнить, что, это из головоломки проекта Эйлера):
let matchingFactors =
factors
|> Seq.filter (fun x -> largestPalindrome % x = 0)
|> Seq.map (fun x -> (x, largestPalindrome / x))
Я понимаю, что сделать фильтр, а затем карту (это преобразование каждого элемента) в C # было бы довольно просто, но вы должны думать на более низком уровне. В частности, вам нужно написать сам цикл и иметь собственное явное выражение if и тому подобное. После изучения F # я понял, что мне стало проще кодировать функциональным образом, где, если вы хотите фильтровать, вы пишете «filter», а если вы хотите отобразить, вы пишете «map» вместо реализации каждая из деталей.
Мне также нравится оператор |>, который, я думаю, отделяет F # от ocaml и, возможно, другие функциональные языки. Это оператор канала, он позволяет вам «передать» вывод одного выражения на вход другого выражения. Это заставляет код следовать тому, как я думаю больше. Как и в приведенном выше фрагменте кода, говорится: «возьмите последовательность факторов, отфильтруйте ее, затем сопоставьте». Это очень высокий уровень мышления, которого вы не понимаете в императивном языке программирования, потому что вы так заняты написанием цикла и операторов if. Это одна вещь, по которой я скучаю больше всего, когда перехожу на другой язык.
Так что в общем, хотя я могу программировать как на C #, так и на F #, мне проще использовать F #, потому что вы можете мыслить на более высоком уровне. Я бы сказал, что из-за того, что мелкие детали удалены из функционального программирования (по крайней мере, в F #), я более продуктивен.
Редактировать : Я видел в одном из комментариев, которые вы просили, пример "состояния" в функциональном языке программирования. F # может быть написано обязательно, поэтому вот прямой пример того, как вы можете иметь изменяемое состояние в F #:
let mutable x = 5
for i in 1..10 do
x <- x + i