副作用のない、参照透過的な関数型プログラミングの約束の 1 つは、そのようなコードを広範囲に最適化できることです。ウィキペディアを引用するには:
多くの場合、データの不変性は、コンパイラが命令型言語で安全でない仮定を行うことを可能にすることで、実行効率につながり、インライン展開の機会を増やします。
より最適化されたコードを生成することで、関数型言語コンパイラが命令型コンパイラよりも優れている例を見たいと思います。
編集:特定のシナリオを提示しようとしましたが、どうやらそれは良い考えではありませんでした。なので、別の方法で説明しようと思います。
プログラマーはアイデア (アルゴリズム) を機械が理解できる言語に翻訳します。同時に、翻訳の最も重要な側面の 1 つは、人間も結果のコードを理解できることです。残念ながら、多くの場合、トレードオフがあります。簡潔で読みやすいコードは、パフォーマンスが低下し、手動で最適化する必要があります。これはエラーが発生しやすく、時間がかかり、コードが読みにくくなります (完全に読みにくくなります)。
不変性や参照透過性などの関数型言語の基盤により、コンパイラは広範な最適化を実行できます。これにより、コードの手動最適化が置き換えられ、プログラマはこのトレードオフから解放される可能性があります。次のようなアイデア(アルゴリズム)とその実装の例を探しています。
- (機能的な) 実装が元のアイデアに近く、理解しやすい。
- 言語のコンパイラによって広範囲に最適化されています。
- 簡潔さと可読性を低下させる手動の最適化なしでは、命令型言語で同様に効率的なコードを書くことは困難 (または不可能) です。
少し曖昧で申し訳ありませんが、アイデアが明確になることを願っています。回答に不必要な制限を加えたくありません。誰かがそれをよりよく表現する方法を知っていれば、私は提案を受け入れます。
私の興味は理論的なことだけではありません。このような例を (とりわけ) 使用して、学生が関数型プログラミングに興味を持つように動機付けたいと思います。
最初は、コメントで提案されたいくつかの例に満足できませんでした。考え直して、私は反対意見を撤回します。これらは良い例です。人々がコメントして投票できるように、自由に完全な回答に拡張してください。
(そのような例の 1 つのクラスは、複数の CPU コアを利用できる並列化されたコードである可能性が最も高いでしょう。多くの場合、関数型言語では、コードの単純さを犠牲にすることなく、これを簡単に実行できます (適切な場所に追加することにより、Haskell のように) par
。pseq
そのような例にも興味がありますが、他の非並列例にも興味があります。)