関数型プログラミングについて読んでいます。私は最近ほとんどC#.netを使用していますが、LISPやF#などの関数型言語が仕事を成し遂げるための明らかに優れたツールとなる実際の例を知りたいのですが。
私は関数型言語の方が優れていると思います。関数型言語は、それらが提供する機能に対してほとんど儀式を要求しない傾向があるからです。たとえば、整数のリストにあるすべての数値を受け取り、数値に1を加えてから合計します。
Clojureの場合:
(reduce + (map inc mylist))
C#(関数型)の場合:
result = mylist.Select(i => i + 1).Sum();
C#の場合(命令型):
int sum = 0;
foreach (int i in mylist)
{
sum += (i + 1);
}
命令型のスタイルを見てみましょう...アキュムレータ(合計)、ローカルスコープの変数(i)を作成する必要があり、ループを列挙する方法を明示する必要もあります。 1行のコードが必要で、関数型言語で非常に読みやすいものは、5行のC#に膨れ上がっており、それほど読みやすくはありません。
したがって、命令型言語と関数型言語の両方を数年間研究した後、私はむしろ、より少ない作業でより多くを達成したいという結論に達しました。すべての趣味のプロジェクトをClojureに切り替えて以来、少ないコードで多くのことを突然達成できることがわかりました。
ですから、あなたの質問に戻って、「関数型言語を使用するのはなぜですか?」と尋ねるのではなく、「なぜ関数型言語を使用しないのですか?」時々、別の方法で問題について考える必要がありますが、私の機能的なコードは、C#で記述しなければならないコードよりも簡潔でエレガントで読みやすいことがわかりました。
コンテキストとして、私は仕事で1日8時間以上C#でコーディングし、Clojureで毎晩約1〜2時間コーディングします。
関数型プログラミングは、学界で一般的に使用されています。それは教育に優れていると主張する人もいます。また、大規模な並行システムにも適しています。
あなたが求めていることのほとんどは、以前のいくつかの質問で答えることができます:
F#の使用法: https://stackoverflow.com/questions/36756/f-what-are-you-using-it-for
Haskellの使用法: https://stackoverflow.com/questions/1604790/what-is-haskell-actually-useful-for
Erlangの使用法: https://stackoverflow.com/questions/1636455/where-is-erlang-used-and-why
関数型言語の多くは、稼働時間の長いシステムで使用するように設計されています。たとえばアーランは、ほとんどの携帯電話キャリアシステム(少なくともエリクソンのノード上に構築されたもの)のロジックの背後にある言語です。これらのシステムは、非常に高いレベルの可用性(9ナイン、99.9999999%の稼働時間、つまり30 ミリ秒年間の許容ダウンタイムのようなもの)を提供すると同時に、モジュール式で高度スケーラブル。ホットスワップ可能なコードなど、多くの関数型言語に組み込まれている機能の一部を使用してこれを行います(DLLを再コンパイルしてシステムを再起動する必要はありません。新しいパッケージをそこに配置するだけで、そのパッケージへの次の呼び出しは新しいコードになります。 )。
それとは別に、コンピューティングの多くのアイデアは、最も簡単に機能的に表現されます。関数型プログラミングは本質的に再帰的で並列性が高いため、このような方法で最適に設計されたタスクは関数型言語に適しています。特に並列化は、クロックを増加させる代わりに実行ユニットをチップに追加することによってCPUのパワーが増加するにつれて、ますます重要になってきています。ファイル処理およびその他のETLタスクは機能的に定義可能であり、問題でより多くのスレッドをスローすることから大きな利益を得ます。
関数型プログラミングは、全体的に優れています。関数型プログラミング言語、または命令型言語のより関数的なスタイルが問題の悪い解決策であるケースを私は見つけていません。
言語がより表現力があると、物事を成し遂げるのがはるかに簡単になります。簡潔さについてではなく、それは副作用ですが、一度に多くのプログラムを理解し、推論できるようにすることです。関数型言語では、常に計算方法欲しいものの説明を書く必要はありません。実際に欲しいものの説明を書くことができます。
関数型プログラミング言語を使用すると、状態や変異ではなく、データの流れと計算の観点からプログラムについて考えるようになります。 問題を解決する機能的にはるかに簡単です。そして、プログラマーが何をすべきか正確に問題を解決していませんか?