HaskellとF#の主な違いは何ですか?[閉まっている]


135

F#Haskellの比較をインターネットで検索しましたが、本当に決定的なものは見つかりませんでした。主な違いは何ですか?なぜ私はどちらかを選択したいのですか?


1
F#の良いところは、その混合パラダイムにより、OOプログラマーにとってより良い出発点を提供することです。彼は徐々に機能的思考に慣れ、C#の場合と同じように使い慣れたOOライブラリの使用に頼ることができます。Haskellは、機能的なエンチラーダ全体を一度に強制します。
マリオ

F#は関数型プログラミング言語ではないことに注意することが重要です。FPからかなり採用されているので、おそらく多くの類似点を見つけることができますが、それにもかかわらず、主にそれらは完全に異なる言語だと思います。
MasterMastic 2015年

回答:


128

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


8
F#のもう1つの潜在的な主な利点は(状況によって異なります)、怠惰ではないことです。つまり、時空の動作について推論するための学習曲線は、事実上すべての人にとってはるかに簡単になります。
cjs 2009年

5
se-radioエピソード108(Simon Peyton Jones)への直接リンク:se-radio.net/podcast/2008-08/…–
Herrmann

9
指摘する価値のあるもう1つの機能は、純粋なプログラミングを強制する言語であるコンパイラーには、多くの最適化に対してより多くの自由度があることです。純粋さを促進するが、チェックされていない不純な操作をコードのブロック内にドロップできるF#のような言語は、すべての呼び出しに必要な副作用が含まれているとコンパイラーが想定するため、いくつかの潜在的な最適化を失います。
ベン

12
@JonHarrop:これはアルゴリズムに関する記述であり、コンパイラーの最適化の適用性とは関係ありません。強制純度言語では、通常、本当に必要な場合に明示的に不純なコードを記述できます(他に何もない場合は、FFIを使用してCを呼び出します)。コンパイラーは、(未知の)副作用の順序を維持するためにバインドされていない場合、コード変換をより自由に適用できます。「推奨される純度」の言語では、ほとんど同じようなコードを記述して同じ最適化を適用できるようにしますが、副作用を無効にする可能性があるだけです(副作用はありませんが、コンパイラーはそれを想定できません)。
ベン

3
@JonHarropいつそれらがすべてアルゴリズムであると主張しましたか?いずれにせよ、HaskellとCではなくHaskellとF#を比較しています。F#は「推奨される純粋さ」の言語であるため、純粋なコードを書くことがよくあります。私が主張しているのは、F#コンパイラーは呼び出しに副作用があると想定する必要があるため、「強制純度」設定でコンパイラーによってまったく同じコードをより適切に最適化できることが多いということです。別のアルゴリズム(副作用に依存するアルゴリズム)を使用するようにコードを書き直すことについて話している。F#とHaskellの純粋なコードの「最適化可能性」について取り上げています。
ベン

53

大きな違い:

  • プラットホーム
  • オブジェクト指向
  • 怠惰

類似点は相違点よりも重要です。基本的に、すでに.NETを使用している場合はF#を使用し、それ以外の場合はHaskellを使用する必要があります。また、OOと怠惰は、F#が(おそらく)すでに知っていることに近いことを意味するため、おそらく習得が容易です。

プラットフォーム:Haskellには独自のランタイムがあり、F#は.NETを使用します。最適化前の平均コードはほぼ同じだと思いますが、パフォーマンスの違いが何であるかはわかりません。.NETライブラリが必要な場合、F#には利点があります。

オブジェクト指向:F#にはオブジェクト指向があり、コードがオブジェクト指向でなくても.NETクラスが使いやすいように細心の注意を払っています。Haskellには、奇妙な方法でOOのようなことを実行できる型クラスがあります。それらは、CommonLispジェネリック関数と交差するRubyミックスインのようなものです。それらはJava / C#インターフェースに少し似ています。

怠惰:Haskellは怠惰ですが、F#は怠惰ではありません。怠惰はいくつかの素晴らしいトリックを可能にし、遅く見えるものを実際に速く実行させます。しかし、コードの実行速度を推測するのは非常に難しいと思います。どちらの言語でも、他のモデルを使用できます。コードで明示する必要があります。

マイナーな違い:

  • 構文:Haskellの構文は私の意見では少し優れています。もう少し簡潔で規則的で、別の行で型を宣言するのが好きです。YMMV。
  • ツール:F#は、そのようなものが好きなら、優れたVisualStudio統合を備えています。Haskellには古いVisualStudioプラグインもありますが、ベータ版が終了したことはないと思います。Haskellにはシンプルなemacsモードがあり、おそらくOCamlのtuareg-modeを使用してF#を編集できます。
  • 副作用:どちらの言語でも、変数を変更する場合は非常に明白です。ただし、Haskellのコンパイラでは、副作用を使用するたびにマークを付ける必要があります。実際の違いは、副作用のあるライブラリを使用する場合も、より多くのことを意識する必要があるということです。

1
パフォーマンスについてはを参照してください。それがどれほど合法かわからない
nawfal 2013

35

F#はMLファミリーの言語の一部であり、OCamlに非常に近いものです。HaskellとOCamlの違いについてのこの議論を読むことをお勧めします。


6
このリンクは質問に答えることができますが、ここに答えの本質的な部分を含めて、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。-レビューから
mirabilos 2015

33

主な違いは、おそらく純粋さの結果ですが、あまり言及されていませんが、モナドの普及です。よく指摘されるように、モナドはほとんどすべての言語で作成できますが、ライブラリ全体で広く使用され、自分で使用すると、人生は大きく変わります。

モナドは、他の言語でははるかに限定された方法で見られるものを提供します。それは、フロー制御の抽象化です。それらはあらゆる種類のことを行うための信じられないほど便利でエレガントな方法であり、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は確かにそうすることを望んでいません。)


2

一つには、主な利点は、F#が.NETプラットフォームに対してコンパイルされるため、Windowsへの展開が容易になることです。F#をASP.NETと組み合わせてWebアプリケーションを構築する方法を説明した例を見てきました;-)

一方で、Haskellはずっと前から存在しているので、その言語の本当の専門家である人々のグループははるかに大きいと思います。

F#の場合、これまでに実際に実装したのは1つだけです。これは、概念実証OSの特異点です。Haskellの実際の実装を見てきました。


4
F#にはすでにいくつかの主要なサクセスストーリー(Halo 3、AdCenter、F#for Visualization)があり、Haskellがサクセスストーリー(Darcs)に最も近いものを小さくしています。
JD

もちろん、これには欠点があることを指摘する価値があります。(CLRの制限)
MasterMastic 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.