OCamlを学び続けるべきか、それともF#またはHaskellに切り替えるべきか疑問に思っています。
これが私が最も興味を持っている基準です:
寿命
実用性
よく設計された
論理的な議論と記事からの引用であなたの意見を支持してください。ありがとうございました。
長寿
Haskellは事実上関数型プログラミング研究の主要な言語です。 Haskell 98は安定した形でさらに何年も続くでしょう、そしてHaskellと呼ばれるものは10年から30年続くかもしれません---言語は進化し続けますが。コミュニティはHaskellに大規模な投資を行っており、主要なGHC開発者が明日バスに見舞われたとしても(有名な「ケンブリッジのバスエラー」問題)、プレートにステップアップできる人はたくさんいます。他にも、それほど複雑ではないコンパイラがあります。
Camlは、フランス国立研究所であるINRIAの小グループによって管理されています。また、多額の投資があり、その他もCamlに投資されており、コードはオープンソースであり、コンパイラーもそれほど複雑ではないため、長期間保守されます。 INClは、INRIAの人々が新しい言語のアイデアを探求するための手段として使用しなくなったように見えるため、Haskellよりもはるかに安定すると予測しています(または、少なくとも以前よりも少ない割合で使用しています)。
会社が何をするか誰が知っていますか? F#が成功した場合、Microsoftは20年間それをサポートできます。それが成功しなかった場合、彼らは2012年にプラグを抜く可能性があります。私は推測できず、試してみません。
実用性
ハッシュテーブルは、高速検索に最適な構造です。そこでのHaskellの支持者は、バイナリツリーであるData.Mapの使用を提案しています。
それはあなたが探しているものに依存します。キーが文字列の場合、 三分探索木 はハッシュテーブルよりも高速であることがよくあります。キーが整数の場合、岡崎とギルの バイナリパトリシアツリー はハッシュと競合します。本当に必要な場合は、IOモナドを使用してHaskellでハッシュテーブルを作成できますが、必要になることはめったにありません。
遅延評価には常にパフォーマンスのペナルティがあると思います。しかし、「実用的」は「できるだけ早く」と同じではありません。パフォーマンスについては、次のことが当てはまります。
Camlプログラムの時間と空間の動作を予測するのが最も簡単です。
F#は真ん中にあります(.NETとJITが何をするかを本当に知っているのは誰ですか?)。
Haskellプログラムの時間と空間の振る舞いを予測するのは最も難しいです。
Haskellには最高のプロファイリングツールがあり、長期的には、これが最高のパフォーマンスを生み出すものです。
パーサーや数学プログラム以上のものを開発できるようになりたいです。
Haskellで可能なことの範囲については、 xmonad ウィンドウマネージャーと パッケージの膨大な配列 at hackage.haskell.org
。
メリットが大きくない限り、かさばる.NETフレームワークに縛られるのは好きではありません。
コメントできません:
うまく設計されている
私は自分の言語が一貫しているのが好きです。
一貫性を評価するためのいくつかのポイント:
Haskellの具体的な構文は非常によく設計されています。 Haskell委員会の良い仕事に絶えず感銘を受けています。 OCaml構文は問題ありませんが、比較すると問題があります。 F#はCamlコア構文から始まり、多くの類似点があります。
HaskellとOCamlはどちらも、演算子のオーバーロードについて非常に一貫したストーリーを持っています。 Haskellには、自分自身を拡張できる一貫した強力なメカニズムがあります。 OCamlにはいかなる種類のオーバーロードもありません。
OCamlは、特にオブジェクトやファンクターを書かない場合、最も単純な型システムを持っています(MLを書いている場合、ファンクターを書かないのは私には夢中ですが、多くのCamlプログラマーはそうしません)。 Haskellの型システムは野心的で強力ですが、継続的に改善されているため、歴史の結果としていくつかの矛盾があります。 F#は、基本的に.NET型システムに加えて、MLのようなHindley-Milnerポリモーフィズムを使用します(質問 "Hindley-Milnerとは" を参照してください。)
OCamlは、バリアントを静的に型付けするか動的に型付けするかについて完全に一貫していないため、両方(「代数的データ型」と「ポリモーフィック型」)を提供します。結果として得られる言語には多くの表現力があり、専門家にとっては素晴らしいものですが、どの構成を使用するかは、アマチュアにとって必ずしも明白ではありません。
OCamlの評価の順序は公式には定義されていません。これは、副作用のある言語では設計上の選択としては不適切です。さらに悪いことに、実装には一貫性がありません。バイトコード化された仮想マシンは1つの順序を使用し、ネイティブコードコンパイラーは他の順序を使用します。
OCamlを知っているなら、F#またはHaskellを学ぶべきですか?
答えは確かにイエスだと思います。理想的には、3つの言語すべてを学ぶ必要があります。それぞれに何か提供できるものがあるからですが、F#だけが重要な未来を持っているので、1つの言語しか学べない場合は、私の を読んでF#を学んでください。 Visual F#2010 for Technical Computingの本 または F#.NETJournalの購読 。
寿命
Microsoftは、4月にVisual Studio 2010の一部としてF#をリリースしたときに、F#のサポートを約束しました。したがって、F#は少なくとも数年間はバラ色の未来が保証されています。高性能のネイティブコードREPL、.NET 4に組み込まれている並列処理のための高レベルの構造、本番品質のIDEモード、F#などの実用的に重要な機能の強力な組み合わせにより、現在、現実世界での適用性の点で、他の関数型プログラミング言語よりもlongはるかに進んでいます。率直に言って、近い将来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プログラマーです。彼らがHaskellを完全に死なせるとは思えませんが、それは彼らがそれをより一般的に役立つ言語に発展させるという意味ではありません。
実用性
あなたがハッシュテーブルについて引用した記事を書きました。それらは優れたデータ構造です。他の人々は、三分木やパトリシアの木のような純粋に機能的な代替案に言及していますが、これらは通常、実際にはハッシュテーブルよりも約10倍遅いです。その理由は、キャッシュミスが今日のパフォーマンスの懸念を支配し、ツリーが余分なO(log n)ポインターの間接化を招くためです。
私の個人的な好みは、オプションの怠惰とオプションの純度です。どちらも現実の世界では一般的に逆効果であるためです(たとえば、怠惰はパフォーマンスとメモリ消費を非常に予測不可能にし、純度は平均的なパフォーマンスを大幅に低下させ、相互運用性を悪夢にします)。私は、自分の会社を通じて関数型プログラミングから完全に生計を立てている唯一の人々の1人です。 Haskellが実行可能だと思ったら、何年も前に多様化していたでしょうが、商業的に実行可能であるとは思わないので、そうしないことを選択し続けています。
「メリットが大きくない限り、かさばる.NETフレームワークに縛られるのは好きではありません」とおっしゃいました。メリットは計り知れません。プロダクション品質のIDE、タイプに特化したジェネリックスなどの非常に効果的な最適化を実行するプロダクション品質のJITコンパイラ、GUIプログラミングからすべてのプロダクション品質のライブラリを入手できます( Game of Lifeの32行のF#を参照 )数の計算に。しかし、少なくとも私にとって.NETの本当の利点は、F#で記述したライブラリを販売して、たくさんのお金を稼ぐことができることです。 OCamlとHaskellのプログラマーにライブラリを販売することに成功した人は誰もいません(そして私は試した数少ない人の一人です)が、F#ライブラリはすでにかなりの量で販売されています。したがって、ソフトウェアを作成して生計を立てたいのであれば、かさばる.NETFrameworkはそれだけの価値があります。
うまく設計されている
これらの言語はすべてうまく設計されていますが、目的は異なります。 OCamlは定理証明を書くために特別に設計されており、HaskellはHaskellを研究するために特別に設計されています。 F#は、相互運用性の低さ、同時ガベージコレクションの欠如、WPFのような成熟した現代ライブラリの欠如など、OCamlとHaskellの最も深刻な実用上の問題すべてに対処して、生産的な現代言語を多くのユーザーに提供するように設計されました。
これはあなたの基準の1つではありませんでしたが、仕事の可用性を考慮しましたか? Haskellは現在実際に144の仕事をリストしており、Ocamlは12をリストし、C#は26,000をリストしています。これらの数字は完璧ではありませんが、F#が出荷されると、求人情報の数がHaskellとOcamlを超えるまでにそう長くはかからないでしょう。
これまでのところ、Visual Studioに含まれるすべてのプログラミング言語には、何千もの求人情報があります。関数型プログラミング言語を日常業務として使用する最高のチャンスが必要な場合は、F#がすぐに使用できるように思われます。
長寿
誰も未来を予測することはできませんが
実用性
Perf:Haskellの直接の経験は十分ではありませんが、中古および第三者の情報に基づくと、OCamlまたはF#は、可能性が低いと思うという意味で、より実用的だと思います。 F#のOCamlで行うのと同じランタイムパフォーマンスをHaskellで取得します。
ライブラリ:.Net Frameworkに簡単にアクセスできることは、F#の大きなメリットです。必要に応じて、「このかさばるものに縛られている」と見なすことができますが、「非常に便利なものの巨大でかさばるライブラリにアクセスできる」ことを忘れないでください。 .Netへの「接続性」はF#の大きなセールスポイントの1つです。 F#は若いため、サードパーティライブラリは少なくなりますが、すでに存在します。 FsCheck 、 FParsec 、 Fake 、および.Netの「ボックス内」のライブラリに加えて他の多くのライブラリ。
ツーリング:比較するのに十分な個人的な経験はありませんが、F#とのVS統合は、今日のOCaml/Haskellで見られるものよりも優れていると思います(F#は来年も少し改善され続けるでしょう)。
変更:F#は、VS2010でサポートされる最初のリリースに近づくにつれてまだ変更されているため、近い将来に耐えなければならない可能性のある言語/ライブラリにいくつかの重大な変更があります。
うまく設計されている
Haskellは間違いなく美しく一貫しています。私は十分なOCamlを知りませんが、私の勘はそれが同様に魅力的であるということです。 F#はどちらよりも「大きい」と思います。つまり、ほこりっぽいコーナーと不整合が多くなります(主に、FPと.Net)の間のインピーダンスの不一致を仲介した結果ですが、全体的なF#は依然として私には「クリーン」だと感じており、存在する矛盾は少なくとも十分な理由/意図されています。
全体
私の意見では、あなたはこれら3つの言語のいずれかをよく知っている「良い状態」になるでしょう。使用したい大規模な長期プロジェクトを知っている場合は目立つかもしれませんが、スキルの多くは移転可能だと思います(Haskellとの間よりもF#とOCamlの間で簡単に転送できますが、これらの3つのうち、たとえばJavaよりも)。
その質問に対する簡単な答えはありませんが、考慮すべきことがいくつかあります。
HaskellとOCamlはどちらも、強力な実装を備えた成熟した言語です。実際、Haskellには複数の優れた実装がありますが、それがあなたの目的にとって有利な大きなポイントではないと思います。
F#ははるかに若く、Microsoftがそれをどこに採用するかを誰が予測できるでしょうか。それについてどのように感じるかは、プログラミング言語について誰もがあなたに話すことができる何よりも、Microsoftについてどのように感じるかに依存します。
OCaml(または一般的にML)は、不快な方法で作業することを強制することなく、クールな機能的な作業をサポートする実用的な言語の選択肢です。代数的データ型、パターンマッチング、型推論など、他の人のお気に入りのものを最大限に活用できます。ああ、そしてオブジェクト。
Haskellはそれらすべて(オブジェクトを除く)を提供しますが、多かれ少なかれ、プログラミングについて知っていると思うことすべてを再考することを余儀なくされます。あなたが何か新しいことを学びたいと思っているなら、これは非常に良いことかもしれませんが、それはあなたが噛みつきたい以上のものかもしれません。私はこれを、生産的で幸せなHaskellプログラマーになる道の途中にいる人だと言います。
OCamlとHaskellはどちらも、コンパイラやAIだけでなく、さまざまな種類のプログラムを作成するために使用されています。 Googleはあなたの友達です。
最後の注意:OCamlはハッシュテーブルを提供しますが、関数型プログラミングを本当に取り入れたいのであれば、コードでそれを使用することはほとんど意味がありません。永続ツリー(Data.Mapなど)はHaskellにとって本当に適切なソリューションであり、Haskellを手にしたときに学ぶべきクールなことの1つであるNiceプロパティがたくさんあります。
F#とOCamlの構文は非常に似ていますが、明らかに、F#は.NETの方が優れています。
どちらを学習または使用するかは、目的のプラットフォームによって異なります。
VS2010にはF#が含まれる予定であり、.NETバイトコードにコンパイルされるため、使用した.NETバージョンをサポートするWindowsOSで使用できます。これにより広い領域が得られますが、現在OCamlにはない制限があります。F#はマシン上のすべてのプロセッサを利用していないように見えますが、それはおそらくF#がまだ開発されているためです。 、これはまだそれほど重要ではない機能かもしれません。
あなたが見ることができるErlangのような他の関数型言語がありますが、基本的に、あなたが1つのFP言語に強いなら、あなたはかなり速く別のものを拾うことができるはずです、それで、好きなものを選んで、その中で面白くてやりがいのあるアプリケーションを開発してみてください。
最終的に、言語ライターはOO言語をマルチコアでうまく機能させる方法を見つけ、FPは再び道に迷うかもしれませんが、そうではありません。 tはすぐに起こっているようです。
寿命の観点から、言語の人気を判断することは非常に困難ですが、ここで簡単にチェックすると、これらは適切な(関数型)言語でタグ付けされた質問の数です:-
2672 Scala、1936 Haskell、1674 F#、1126 Clojure、709スキーム、332 OCaml
これは、人々が現在積極的に学習している言語を示す良い指標であり、したがって、今後数年間でどの言語が人気になるかを示す良い指標になると思います。
これは、F#を学ぶかどうかに関するOPの質問に直接関係しているのではなく、金融セクターでの実際のOCamlの使用例です。 http://ocaml.janestreet.com/?q= node/61
とても面白い話です。