24

OCaml の学習を続けるべきか、F# や Haskell に切り替えるべきか迷っています。

私が最も興味を持っている基準は次のとおりです。

  • 長寿

    • どの言語が長持ちしますか? ユーザーや開発者によって数年で放棄される可能性のあるものを学びたくありません。
    • Inria、Microsoft、グラスゴー大学は、それぞれのコンパイラを長期的にサポートし続けますか?
  • 実用性

    • このような記事を見ると、Haskell を使うのが怖くなります。ハッシュ テーブルは、高速検索に最適な構造です。Haskell の支持者は、バイナリ ツリーである Data.Map の使用を提案しています。
    • メリットが大きい場合を除き、かさばる .NET フレームワークに縛られるのは好きではありません。
    • パーサーや数学プログラム以上のものを開発できるようになりたいです。
  • よく設計された

    • 私は自分の言語が一貫していることを好みます。

論理的な議論と記事からの引用であなたの意見を裏付けてください. ありがとうございました。

4

8 に答える 8

66

長寿

  • Haskell は、事実上、関数型プログラミング研究の主要言語です。Haskell 98 は、安定した形でさらに何年も存続し、Haskell と呼ばれるものは 10 年から 30 年存続する可能性がありますが、言語は進化し続けます。コミュニティは Haskell に多額の投資を行っており、主要な GHC 開発者が明日バスに見舞われたとしても (有名な「ケンブリッジのバス エラー」問題)、他の多くの開発者が代わりに手を差し伸べることができます。それほど複雑ではないコンパイラもあります。

  • Caml は、フランスの国立研究所である INRIA の小さなグループによって管理されています。彼らもかなりの投資をしており、他の人もCamlに投資しており、コードはオープンソースであり、コンパイラはそれほど複雑ではないため、これも長期間維持されます. Caml は Haskell よりもはるかに安定していると私は予測しています。INRIA の人々はもはや、新しい言語のアイデアを探求するための手段として Caml を使用していないようです (少なくとも、以前よりも少ない割合でそうしています)。

  • 会社が何をするか誰が知っていますか?F# が成功すれば、Microsoft は 20 年間サポートできます。成功しなければ、2012 年に撤退する可能性があります。

実用性

ハッシュ テーブルは、高速検索に最適な構造です。Haskell の支持者は、バイナリ ツリーである Data.Map の使用を提案しています。

それはあなたが探しているものに依存します。キーが文字列の場合、多くの場合、三分探索木はハッシュ テーブルよりも高速です。キーが整数の場合、Okasaki と Gill のバイナリ パトリシア ツリーはハッシュと競合します。本当にやりたい場合は、Haskell で IO モナドを使用してハッシュ テーブルを作成できますが、必要になることはめったにありません。

遅延評価には常にパフォーマンスのペナルティがあると思います。しかし、「実用的」とは「できるだけ速く」ということではありません。パフォーマンスについては、次のことが当てはまります。

  • Caml プログラムの時間と空間の動作を予測するのは最も簡単です。

  • F# はその中間にあります (.NET と JIT が何をするかを誰が本当に知っているでしょうか?)。

  • Haskell プログラムの時間と空間の動作を予測することは最も困難です。

  • Haskell には最高のプロファイリング ツールがあり、長期的には最高のパフォーマンスが得られます。

パーサーや数学プログラム以上のものを開発できるようになりたいです。

Haskell で可能な範囲のアイデアについては、xmonadウィンドウ マネージャーと膨大な数のパッケージを参照してhackage.haskell.orgください。

メリットが大きい場合を除き、かさばる .NET フレームワークに縛られるのは好きではありません。

コメントできません:

よく設計された

私は自分の言語が一貫していることを好みます。

一貫性を評価するポイント:

  • Haskell の具象構文は非常によく設計されています。私は、Haskell 委員会の優れた仕事に常に感銘を受けています。OCaml 構文は問題ありませんが、比較すると問題があります。F# は Caml コア構文から始まり、多くの類似点があります。

  • Haskell と OCaml はどちらも、演算子のオーバーロードについて非常に一貫したストーリーを持っています。Haskell には、自分で拡張できる一貫した強力なメカニズムがあります。OCaml にはいかなる種類のオーバーロードもありません。

  • OCaml は最も単純な型システムを持っています。特に、オブジェクトとファンクターを書かない場合はそうです (多くの Caml プログラマーはそうしませんが、ML を書いている場合にファンクターを書かないのはおかしいと思いますが)。Haskell の型システムは野心的で強力ですが、継続的に改善されています。これは、歴史の結果として矛盾があることを意味します。F# は基本的に .NET 型システムと、ML に似た Hindley-Milner ポリモーフィズムを使用します (質問「Hindley-Milner とは」を参照してください)。

  • OCaml は、バリアントが静的に型付けされるべきか、動的に型付けされるべきかについて完全に一致していません。結果として得られる言語には多くの表現力があり、これは専門家にとっては素晴らしいことですが、どの構文を使用するかは、アマチュアにとって必ずしも明らかではありません。

  • OCaml の評価の順序は公式には定義されていません。これは、副作用のある言語では不適切な設計の選択です。さらに悪いことに、実装には一貫性がありません。バイトコード化された仮想マシンが 1 つの順序を使用し、ネイティブ コード コンパイラが別の順序を使用します。

于 2009-05-05T04:27:06.427 に答える
24

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の最も深刻な実用上の問題すべてに対処するように設計されました。

于 2009-05-06T00:59:35.747 に答える
6

この質問に対する簡単な答えはありませんが、考慮すべき点がいくつかあります。

Haskell と OCaml はどちらも、強力な実装を備えた成熟した言語です。実際には、Haskell には複数の優れた実装がありますが、それが目的に有利な主要なポイントではないと思います。

F# はずっと新しいものであり、Microsoft がそれをどのように採用するかを誰が予測できるでしょうか? それについてあなたがどう思うかは、プログラミング言語についてだれもが教えてくれることよりも、Microsoft についてどのように感じているかにかかっています。

OCaml (または一般的には ML) は、不快な方法で作業することを強制することなく、クールな機能的な作業をサポートする実用的な言語の選択です。代数データ型、パターン マッチング、型推論、および他のみんなのお気に入りのものなどの利点を最大限に活用できます。ああ、そしてオブジェクト。

Haskell はそれをすべて (オブジェクトを除いてほとんど) 提供しますが、多かれ少なかれ、プログラミングについて知っていると思っていることすべてを再考するように強制します。何か新しいことを学びたいと思っているなら、これはとても良いことかもしれませんが、それ以上のものかもしれません。私はこれを、生産的で幸せな Haskell プログラマーになるための道のりの途中にある人として言います。

OCaml と Haskell はどちらも、コンパイラや AI などだけでなく、さまざまな種類のプログラムを作成するために使用されています。グーグルはあなたの友達です。

最後に 1 つ: OCaml はハッシュテーブルを提供しますが、本当に関数型プログラミングを取り入れたいのであれば、コードでハッシュテーブルを使用するのはほとんど賢明ではありません。永続ツリー (Data.Map など) は実際には Haskell に適したソリューションであり、多くの優れたプロパティを備えています。これは、Haskell を手に取ったときに学ぶべきクールなことの 1 つです。

于 2009-05-05T01:00:41.587 に答える
3

F# と OCaml は構文が非常に似ていますが、.NET では明らかに F# の方が優れています。

どちらを学習または使用するかは、目的のプラットフォームに依存する必要があります。

VS2010 には F# が含まれる予定で、.NET バイトコードにコンパイルされるため、使用した .NET バージョンをサポートする Windows OS で使用できます。これにより大きな領域が得られますが、現在 OCaml にない F# には制限があります。F# はマシン上のすべてのプロセッサを利用していないように見えますが、おそらく F# がまだ開発中であるためです。 、これはまだそれほど重要ではない機能かもしれません。

他にも Erlang などの関数型言語がありますが、基本的には 1 つの FP 言語に精通していれば、すぐに別の言語を習得できるはずです。その中で興味深くやりがいのあるアプリケーションを開発します。

最終的に、言語の作成者は OO 言語をマルチコアでうまく動作させる方法を見つけ、FP は再び道に迷うかもしれませんが、それはすぐには起こらないようです。

于 2009-05-05T00:25:52.200 に答える
1

寿命に関しては、言語の人気を判断することは非常に困難ですが、ここで簡単に確認すると、これらは適切な (機能的な) 言語でタグ付けされた質問の数です:-

2672 Scala、1936 Haskell、1674 F#、1126 Clojure、709 Scheme、332 OCaml

これは、人々が現在どの言語を積極的に学習しているかを示す良い指標であり、今後数年間でどの言語が人気になるかを示す良い指標になると思います.

于 2010-12-16T13:44:31.750 に答える
1

これは、F# を学習するかどうかに関する OP の質問とは直接関係ありませんが、金融部門での実際の OCaml の使用例です: http://ocaml.janestreet.com/?q=node/61

非常に興味深い話。

于 2010-08-13T08:10:55.790 に答える