関数型プログラミング-不変性は高価ですか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。私たちは回答が事実、参考文献、または専門知識によってサポートされることを期待しますが、この質問はおそらく議論、議論、投票、または拡張された議論を誘います。この質問を改善でき、再開できると思われる場合は、ヘルプセンターにアクセスしてください。 7年前休業。 問題は2つの部分に分かれています。最初は概念的なものです。次に、同じ質問をScalaでより具体的に見ていきます。 プログラミング言語で不変のデータ構造のみを使用すると、実際には特定のアルゴリズム/ロジックの実装が本質的に計算コストが高くなりますか?これは、不変性が純粋に関数型言語の中心的な信条であることを示しています。これに影響を与える他の要因はありますか? より具体的な例を見てみましょう。クイックソートは、通常、メモリ内データ構造に対する可変操作を使用して教えられ、実装されます。可変バージョンに匹敵する計算およびストレージオーバーヘッドを備えたPURE機能的な方法で、そのようなことをどのように実装しますか。特にScalaで。以下にいくつかの大まかなベンチマークを含めました。 詳細: 私は命令型プログラミングのバックグラウンド(C ++、Java)から来ています。私は関数型プログラミング、特にScalaを調査しています。 純粋な関数型プログラミングの主要な原則のいくつか: 機能は一流の市民です。 関数には副作用がないため、オブジェクト/データ構造は不変です。 最近のJVMはオブジェクト作成に関して非常に効率的であり、ガベージコレクションは存続期間の短いオブジェクトに対して非常に安価ですが、オブジェクトの作成を最小限に抑える方が適切でしょう。少なくとも、同時実行性とロックが問題にならないシングルスレッドアプリケーションでは。Scalaはハイブリッドパラダイムであるため、必要に応じて、可変オブジェクトを使用して命令型コードを記述することを選択できます。しかし、オブジェクトを再利用し、割り当てを最小限にしようと何年も費やした人として。それさえ許さない思想の学校をよく理解して欲しい。 特定のケースとして、このチュートリアル 6のこのコードスニペットに少し驚いた。これには、Java版のQuicksortがあり、その後に、見栄えの良いScalaの実装が続きます。 実装をベンチマークする私の試みはここにあります。詳細なプロファイリングは行っていません。しかし、私の推測では、割り当てられるオブジェクトの数は線形(再帰呼び出しごとに1つ)であるため、Scalaバージョンの方が遅くなります。テールコールの最適化が機能する可能性はありますか?私が正しい場合、Scalaは自己再帰呼び出しの末尾呼び出しの最適化をサポートしています。だから、それはそれを助けるだけであるべきです。Scala 2.8を使用しています。 Javaバージョン public class QuickSortJ { public static void sort(int[] xs) { sort(xs, 0, xs.length -1 ); } static void sort(int[] xs, int l, int r) { if (r >= l) return; int pivot = …