私はインターネットでF#とHaskellの比較を検索しましたが、本当に決定的なものは見つかりませんでした。主な違いは何ですか?なぜ私はどちらかを選択したいのですか?
5 に答える
Haskellは「純粋」関数型言語ですが、F#には命令型/OO関数型言語と関数型言語の両方の側面があります。Haskellには遅延評価もありますが、これは関数型言語ではかなりまれです。
これらはどういう意味ですか?純粋関数型言語は、副作用(または関数が呼び出されたときに共有状態の変化)がないことを意味します。つまり、f(x)を呼び出すと、関数から値を返す以外に何も起こらないことが保証されます。コンソール出力、データベース出力、グローバル変数または静的変数への変更など。Haskellは(モナドを介して)純粋でない関数を持つことができますが、宣言によって「明示的に」暗黙的に示される必要があります。
純粋関数型言語と「副作用なし」プログラミングは、無数のロックとセマフォではなく、共有状態がないと間違いがはるかに難しいため、マルチコアの同時実行に適しているため、最近人気が高まっています。
遅延評価とは、絶対に必要になるまで関数が評価されないことです。つまり、必要のないときに多くの操作を回避できます。次のような基本的なC#if句でこれを考えてください。
if(IsSomethingTrue() && AnotherThingTrue())
{
do something;
}
IsSomethingTrue()
falseの場合、AnotherThingTrue()
メソッドは評価されません。
Haskellは素晴らしい言語ですが、F#の主な利点(当面)は、CLRの上に配置されることです。これは、多言語プログラミングに役立ちます。ある日、WebUIをASP.netMVCで、ビジネスロジックをC#で、コアアルゴリズムをF#で、単体テストをIronrubyで作成することができます。これらはすべて.Netフレームワークの中で行われます。
Haskellの詳細については、Simon Peyton Jonesのソフトウェアエンジニアリングラジオを聞いてください:エピソード108:関数型プログラミングとHaskellに関するSimon Peyton Jones
大きな違い:
- プラットホーム
- オブジェクト指向
- 怠惰
類似点は相違点よりも重要です。基本的に、既に .NET を使用している場合は F# を使用し、それ以外の場合は Haskell を使用する必要があります。また、OO と怠惰は、F# が (おそらく) 既に知っているものに近いことを意味するため、おそらく習得が容易です。
プラットフォーム : Haskell には独自のランタイムがあり、F# は .NET を使用します。平均的なコードは最適化前とほぼ同じだと思いますが、パフォーマンスの違いが何であるかはわかりません。.NET ライブラリが必要な場合は、F# が有利です。
オブジェクト指向 : F# には OO があり、コードが OO でない場合でも .NET クラスが使いやすいように細心の注意を払っています。Haskell には、OO のようなことを奇妙な方法で実行できる型クラスがあります。これらは、Common Lisp の汎用関数を組み合わせた Ruby mixin のようなものです。これらは、Java/C# インターフェースに少し似ています。
怠惰 : Haskell は怠惰ですが、F# はそうではありません。怠惰はいくつかの優れたトリックを可能にし、遅く見えるいくつかのことを実際には速く実行します。しかし、自分のコードがどれだけ速く実行されるかを推測するのは、はるかに難しいと思います。どちらの言語でも、他のモデルを使用できます。コードで明示する必要があるだけです。
小さな違い:
- 構文 : 私の意見では、Haskell の構文の方がわずかに優れています。もう少し簡潔で規則的で、型を別の行で宣言するのが好きです。YMMV。
- ツール : F# は、Visual Studio との優れた統合機能を備えています。Haskell には古い Visual Studio プラグインもありますが、ベータ版から出たことはないと思います。Haskell にはシンプルな emacs モードがあり、おそらく OCaml の tuareg-modeを使用して F# を編集できます。
- 副作用 : どちらの言語でも、変数を変更しているときはかなり明白です。しかし、Haskell のコンパイラは、副作用を使用するたびにマークすることも強制します。実際の違いは、副作用のあるライブラリを使用する場合にも、より多くの注意を払う必要があることです。
F#はMLファミリーの言語の一部であり、OCamlに非常に近いものです。HaskellとOCamlの違いについてのこの議論を読むことをお勧めします。
おそらく純粋さの結果ですが、あまり言及されていない大きな違いは、モナドの広範な使用です。よく指摘されるように、モナドはほとんどすべての言語で構築できますが、モナドがライブラリ全体で広く使用され、自分で使用すると、生活は大きく変わります。
モナドは、フロー制御の抽象化という、他の言語でははるかに限定された方法で見られるものを提供します。それらはあらゆる種類のことを行うための信じられないほど便利で洗練された方法であり、1 年間の Haskell は私のプログラミング方法を完全に変えました。これは、何年も前に命令型プログラミングから OO プログラミングに移行したのと同じように、またはずっと後に、高階関数を使用した。
残念ながら、このような分野では、違いが何であるかを理解するのに十分な理解を提供する方法はありません. 実際、いくら書いてもそれはできません。真の理解を得るには、コードの学習と記述に十分な時間を費やさなければなりません。
同様に、ライブラリは明らかに OO の観点から設計されているため、F# は、.NET プラットフォーム/ライブラリとやり取りするときに (関数型プログラミングの観点から) 機能がわずかに低下したり、扱いにくくなったりすることがあります。
したがって、次のように決定を検討することができます: これらの言語の 1 つを試して、比較的小さな改善を迅速に得ようとしていますか? それとも、もっと時間をかけて、より大きな何かのためにすぐには得られない利益を得たいと思っていますか?長期的に。(または、少なくとも、より大きなものを手に入れなければ、すぐに別のものに簡単に切り替えることができますか?) 前者の場合は F# が選択され、後者の場合は Haskell が選択されます。
他のいくつかの無関係なポイント:
Haskell の設計者は ML をよく知っていたので、Haskell の構文の方がわずかに優れていますが、これは驚くことではありません。ただし、F# の「軽い」構文は ML 構文の改善に大きく貢献するため、そこに大きなギャップはありません。
プラットフォームに関して言えば、F# はもちろん .NET です。それがMonoでどれだけうまくいくかはわかりません。GHC は独自のランタイムでマシン コードにコンパイルされ、Windows と Unix の両方で適切に動作します。これは、C++ と同じように .NET と比較されます。これは、特に速度と低レベルのマシン アクセスの点で、状況によっては利点となる可能性があります。(たとえば、私は Haskell/GHC で DDE サーバーを作成するのに問題はありませんでした。.NET 言語でそれを行うことはできないと思います。また、MS はあなたがそれを行うことを望んでいません。)
ええと、主な利点は、F#が.NETプラットフォームに対してコンパイルされるため、Windowsへの展開が容易になることです。F#をASP.NETと組み合わせてWebアプリケーションを構築する方法を説明した例を見てきました;-)
一方で、Haskellはずっと前から存在しているので、その言語の本当の専門家である人々のグループははるかに大きいと思います。
F#の場合、これまでに実際に実装したのは1つだけです。これは、概念実証OSの特異点です。Haskellの実際の実装を見てきました。