OCamlを知っているなら、F#またはHaskellを学ぶべきですか?
答えは確かにイエスだと思います。理想的には、3つの言語すべてを学ぶ必要があります。それぞれに何か提供できるものがあるからですが、F#だけが重要な未来を持っているので、1つの言語しか学べない場合は、ビジュアルF#を読んでF#を学んでください。テクニカルコンピューティングの本またはF#.NETジャーナルの購読については2010年。
長寿
Microsoftは、4月にVisual Studio 2010の一部としてF#をリリースしたときに、F#のサポートを約束しました。したがって、F#は少なくとも数年間はバラ色の未来が保証されています。高性能のネイティブコードREPL、.NET 4に組み込まれた並列処理用の高レベルの構造、本番品質のIDEモードなど、実用上重要な機能の強力な組み合わせにより、F#は他の関数型プログラミングよりもはるかに優れています。現在、現実世界での適用性の観点からの言語。率直に言って、近い将来F#と競争できるかもしれない何かに取り組んでいる人は誰もいません。私自身のオープンソースHLVMプロジェクトはそうする試みですが、準備が整っているとは言えません。
対照的に、OCamlとHaskellはどちらも非常に非生産的な方向で開発されています。これは数年前からOCamlを殺しており、Haskellが今後数年にわたって追随することを期待しています。以前のプロのOCamlおよびHaskellプログラマーのほとんどはすでにF#に移行しており(たとえば、Credit Suisse、Flying Frog Consultancy)、残りのほとんどは、近い将来、ClojureやScalaなどのより実用的な代替手段に移行することは間違いありません。
具体的には、OCamlのQPLライセンスは、増え続ける基本的な設計上の欠陥(32ビットマシンでの16Mbの文字列と配列の制限、共有メモリの並列処理、値型、型消去によるパラメトリック多態性、解釈されたREPL、面倒なFFI)を他の人が修正することを防ぎます。など)派生作品をパッチの形でのみオリジナルに配布する必要があり、Debianパッケージのメンテナは代替のアップストリームを承認することを拒否するためです。OCaml 3.12のファーストクラスモジュールなど、言語に追加されている新機能は、マルチコア機能ほど価値がありません。
一部のプロジェクトはOCamlを保存するために開始されましたが、遅すぎることが判明しました。パラレルGCは実質的に役に立たず、David Tellerはバッテリー付属プロジェクトを終了しました(ただし、カットダウン形式でピックアップおよびリリースされています)。その結果、OCamlは2007年に最も人気のある関数型言語から今日では大幅に減少し、caml-listのトラフィックは2007年以来50%以上減少しています。
HaskellはOCamlよりも産業ユーザーが少なく、マルチコアをサポートしていますが、それでも非常に非生産的な方向に開発されています。Haskellは、ケンブリッジ(英国)のMicrosoftResearchの2人によってほぼ完全に開発されています。純粋関数型プログラミングは設計上パフォーマンスに悪いという事実にもかかわらず、大量の不要なコピーがメモリの壁にぶつかり、スケーラブルな並列処理の希望を破壊する場合、マルチコアを対象とした並列Haskellのソリューションの開発を続けています。マルチコア。
業界におけるHaskellの唯一の主要なユーザーは、約30人のフルタイムのHaskellプログラマーを持つGaloisです。Haskellを完全に死なせるとは思えませんが、それは彼らがHaskellをより一般的に役立つ言語に発展させるという意味ではありません。
実用性
ハッシュテーブルについて引用した記事を書きました。それらは優れたデータ構造です。他の人々は、三分木やパトリシアの木のような純粋に機能的な代替案に言及していますが、これらは通常、実際にはハッシュテーブルよりも約10倍遅いです。その理由は、キャッシュミスが今日のパフォーマンスの懸念を支配し、ツリーが余分なO(log n)ポインター間接参照を発生させるためです。
私の個人的な好みは、オプションの怠惰とオプションの純度です。どちらも現実の世界では一般的に逆効果であるためです(たとえば、怠惰はパフォーマンスとメモリ消費を非常に予測不可能にし、純度は平均的なケースのパフォーマンスを大幅に低下させ、相互運用性を悪夢にします)。私は、自分の会社を通じて関数型プログラミングから完全に生計を立てている唯一の人々の1人です。Haskellが実行可能だと思ったら、何年も前に多様化していたでしょうが、商業的に実行可能であるとは思わないので、そうしないことを選択し続けています。
「メリットが大きくない限り、かさばる.NETFrameworkに縛られるのは好きではありません」とおっしゃいました。メリットは計り知れません。プロダクション品質のIDE、タイプに特化したジェネリックスなどの非常に効果的な最適化を実行するプロダクション品質のJITコンパイラ、GUIプログラミング(32行のF#のGame of Lifeを参照)から数値計算までのすべてのプロダクション品質のライブラリを入手できます。しかし、少なくとも私にとって.NETの本当の利点は、F#で記述したライブラリを販売して、たくさんのお金を稼ぐことができることです。OCamlとHaskellのプログラマーにライブラリを販売することに成功した人は誰もいません(そして私は試した数少ない人の一人です)が、F#ライブラリはすでにかなりの量で販売されています。したがって、ソフトウェアを作成して生計を立てたいのであれば、かさばる.NETFrameworkはそれだけの価値があります。
うまく設計された
これらの言語はすべてうまく設計されていますが、目的は異なります。OCamlは定理証明者を書くために特別に設計されており、HaskellはHaskellを研究するために特別に設計されています。F#は、生産性の高い現代言語を多くのユーザーに提供するために、相互運用性の低さ、同時ガベージコレクションの欠如、WPFなどの成熟した現代ライブラリの欠如など、OCamlとHaskellの最も深刻な実用上の問題すべてに対処するように設計されました。