F#とHaskellの比較をインターネットで検索しましたが、本当に決定的なものは見つかりませんでした。主な違いは何ですか?なぜ私はどちらかを選択したいのですか?
回答:
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#にはオブジェクト指向があり、コードがオブジェクト指向でなくても.NETクラスが使いやすいように細心の注意を払っています。Haskellには、奇妙な方法でOOのようなことを実行できる型クラスがあります。それらは、CommonLispジェネリック関数と交差するRubyミックスインのようなものです。それらはJava / C#インターフェースに少し似ています。
怠惰:Haskellは怠惰ですが、F#は怠惰ではありません。怠惰はいくつかの素晴らしいトリックを可能にし、遅く見えるものを実際に速く実行させます。しかし、コードの実行速度を推測するのは非常に難しいと思います。どちらの言語でも、他のモデルを使用できます。コードで明示する必要があります。
マイナーな違い:
F#はMLファミリーの言語の一部であり、OCamlに非常に近いものです。HaskellとOCamlの違いについてのこの議論を読むことをお勧めします。
主な違いは、おそらく純粋さの結果ですが、あまり言及されていませんが、モナドの普及です。よく指摘されるように、モナドはほとんどすべての言語で作成できますが、ライブラリ全体で広く使用され、自分で使用すると、人生は大きく変わります。
モナドは、他の言語でははるかに限定された方法で見られるものを提供します。それは、フロー制御の抽象化です。それらはあらゆる種類のことを行うための信じられないほど便利でエレガントな方法であり、Haskellの1年は、何年も前に命令型プログラミングからオブジェクト指向プログラミングに移行したのと同じように、プログラミングの方法を完全に変えました。高階関数を使用しました。
残念ながら、このようなスペースでは、違いが何であるかを理解するのに十分な理解を提供する方法はありません。実際、どんな量の文章でもそれはできません。本当の理解を得るには、コードの学習と記述に十分な時間を費やす必要があります。
同様に、ライブラリは明らかにOOの観点から設計されているため、.NETプラットフォーム/ライブラリとインターフェイスするときに、F#の機能が少し低下したり、(関数型プログラミングの観点から)扱いにくくなることがあります。
したがって、あなたはこのようにあなたの決定を考えるかもしれません:あなたは改善の迅速で比較的小さな増分を得るためにこれらの言語の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の実際の実装を見てきました。