他の答えの多くは、関数型プログラミングのパフォーマンス(並列処理)側に焦点を当てていますが、これは非常に重要であると思います。ただし、生産性について具体的に質問した場合と同様に、命令型パラダイムよりも機能パラダイムで同じことをより速くプログラミングできますか。
私は実際に(個人的な経験から)、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#を習得して以来、機能的な方法でコーディングする方が簡単だと気づきました。フィルターしたい場合は、「フィルター」を記述し、マップしたい場合は、実装する代わりに「マップ」を記述します。詳細のそれぞれ。
また、F#とocamlを分離する|>演算子、およびおそらく他の関数型言語も気に入っています。これはパイプ演算子であり、ある式の出力を別の式の入力に「パイプ」することができます。それはコードが私がもっと考える方法に従うようにします。上記のコードスニペットと同様に、「因子シーケンスを取得し、フィルター処理してから、マッピングします」と言っています。これは非常に高いレベルの考え方であり、ループとifステートメントの記述で忙しいため、命令型プログラミング言語では理解できません。それは私が別の言語に行くときはいつも一番寂しいことです。
したがって、一般的に言えば、C#とF#の両方でプログラムを作成できますが、より高いレベルで考えることができるので、F#を使用する方が簡単です。(少なくともF#で)関数型プログラミングから細部が削除されているため、生産性が向上すると私は主張します。
編集:私は、関数型プログラミング言語での「状態」の例を要求したコメントの1つを見ました。F#は強制的に記述できるため、F#で変更可能な状態にする方法の直接的な例を次に示します。
let mutable x = 5
for i in 1..10 do
x <- x + i