Багато інших відповідей були зосереджені на продуктивності (паралелізмі) сторони функціонального програмування, що я вважаю дуже важливим. Однак ви спеціально запитували про продуктивність, як, наприклад, чи можете ви програмувати те ж саме швидше у функціональній парадигмі, ніж у імперативній парадигмі.
Я фактично знаходжу (з особистого досвіду), що програмування на 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 і, можливо, інші функціональні мови. Це оператор труби, він дозволяє вам "передати" висновок одного виразу на вхід іншого виразу. Це змушує код слідувати, як я більше думаю. Як і у фрагменті коду, наведеному вище, така приказка: "візьміть послідовність факторів, відфільтруйте її, а потім відмітьте її". Це дуже високий рівень мислення, який ви не отримуєте в обов'язковій мові програмування, тому що ви настільки зайняті написанням циклу і якщо заяви. Це одне, що мені найбільше не вистачає, коли я переходжу на іншу мову.
Так що загалом, навіть якщо я можу програмувати як на C #, так і на F #, мені легше використовувати F #, оскільки ви можете думати на більш високому рівні. Я заперечую, що оскільки менші деталі вилучаються з функціонального програмування (принаймні в F #), я є більш продуктивним.
Редагувати : Я бачив в одному з коментарів, що ви просили приклад "стану" у функціональній мові програмування. F # можна записати в обов’язковому порядку, тому ось прямий приклад того, як можна змінити стан змін у F #:
let mutable x = 5
for i in 1..10 do
x <- x + i