私は C++11 の新機能を見てきましたが、C++11 を使用して非常に関数型のプログラミング スタイルでプログラミングできるようになりそうです。F# で型 List、Seq、Array を使用することに慣れてきましたが、それらのメンバーをある種の C++11 テンプレートに移植できない理由がわかりません。混合関数型プログラミング スタイルで C++11 と F# のようなものを使用することには、どのような問題や利点がありますか? functional
C++11 が出たら、Boost の連中が新しいものを作るかもしれません。
5 に答える
C++ で関数型のプログラミングをしようとする際の最大の問題は、末尾再帰がサポートされていないことです。関数型言語では、末尾再帰が正しく実行されていればスタックの爆発を心配する必要はありませんが、C++ では常に心配する必要があります。したがって、多くの「関数型」タイプのアルゴリズムは扱いにくく、重くなります。
C#で関数型コードを記述しようとして遭遇した問題のいくつかを次に示します。C++をまだ使用していたときのいくつかの利点が混ざっています。
- パターンマッチングの欠如。あなたがそれに慣れたら、それを持っていないことは私を夢中にさせることができます。
- タプルの構文糖衣の欠如。
- レコードのコピーとフィールドの設定を一度に行うための構文の欠如。
- リストと配列の構文の欠如。これは、コンストラクターとパターンマッチングにも当てはまります。
- GCがなく、安全でないメモリアクセス。GCに制約されないことは利点ですが、C ++コードでValgrindを最初に実行したときに得たレポートを思い出すと、バグがないと思っていたので、ずっと怖かったです。
- テンプレートコードを理解することは、すべての人間が正確にアクセスできるわけではありません。私は自分のことを理解するのに問題はありませんが、STL、boost、またはcgalの実装を調べるたびに、それらがどの言語を使用しているのか疑問に思いました。私のC++とそのC++は同じ世界に住んでいません。
- 別のバージョンのブーストを使用するライブラリ(またはテンプレートを使用するライブラリ)を扱うのがまったく面白くありません。
- 個別のヘッダー/実装ファイルの冗長性。
- C ++での型推論は、たとえばF#までは行きません。C ++ 11で改善されたことは知っていますが、私が理解しているように、C#のvarに似ています。これは、F#スタイルの推論を味わったら十分ではありません。
- シーケンス式、内包表記、非同期などの計算式の欠如...
テンプレートとプリプロセッサの魔法を使用してC++でこれらのポイントのいくつかが実際に可能であったとしても、私は驚かないでしょうが、非常に冒険的で寛容な同僚がいない限り、これらを本番環境で実際に使用することはできません。
私は以前、熱心なC++愛好家でした。次に、テンプレートを使用したジェネリックプログラミングと、関数オブジェクトを使用した高階関数の使用を開始しました。書くのは面倒でした。関数型言語を試した後、振り返ることはありませんでした。
これは興味深いかもしれません:
混合関数型プログラミングスタイルでc++0xとf#のようなものを使用する場合、どのような利点の問題がありますか?
40年前にLispの文脈で議論された上向きのfunarg問題!
C++0x で関数型言語に共通する特定の最適化 (一般的な部分式の削除など) を実装するのは… 興味深い… だろうと思います。