C#vs F#またはF#vs C#を使用する利点は何ですか?[閉まっている]


93

私は、製品の出荷よりもプロトタイピングを行うテクノロジー企業で働いています。C#とF#の違いは何ですか、なぜMSがF#を作成したのか、どのシナリオがC#より優れているのかを尋ねられました。

私はしばらくこの言語を使用しており、F#の優れた機能について簡単に説明できるので気に入っていますが、C#で他の言語を使用する理由を説明する経験がありません。

C#vs F#またはF#vs C#を使用する利点は何ですか?


4
私には、SOにはすでにかなりの数の質問があり、少なくとも部分的にあなたの質問に答えているようです。「f#キーワード」の代わりに「[F#]キーワード」を使用して検索してみましたか?(「[f#]の利点」など)
Benjol

回答:


86

命令型言語に対する関数型プログラミングの一般的な利点:

F#などの関数型プログラミング言語では、多くの問題をはるかに簡単に、定義に近づけ、より簡潔に定式化でき、コードはエラーが発生しにくくなります(不変性、より強力な型システム、直感的な再帰アルゴリズム)。コンピュータがあなたに言ってほしいことの代わりにあなたが何を意味するかをコード化することができます;-) あなたがそれをグーグルするとき、またはSOでそれを検索するときさえ、このような多くの議論を見つけるでしょう。

特別なF#の利点:

  • -式を使用すると、非同期プログラミングが非常に簡単で直感的になりますasync {}-ParallelFXを使用しても、対応するC#コードははるかに大きくなります

  • コンパイラコンパイラとドメイン固有言語の非常に簡単な統合

  • 必要に応じて言語を拡張する:LOP

  • 測定の単位

  • より柔軟な構文

  • 多くの場合、より短く、よりエレガントなソリューション

このドキュメントをご覧ください

C#の利点は、関数型プログラミング言語よりも「命令型」アプリケーション(ユーザーインターフェイス、命令型アルゴリズム)の方が正確であることが多く、使用する.NET-Frameworkは命令型に設計されており、より広く普及していることです。

さらに、F#とC#を1つのソリューションにまとめることができるため、両方の言語の利点を組み合わせて、必要な場所で使用できます。


16
彼らは非常に奇妙な方法で結合します。たとえば、F#で>演算子をオーバーロードできます。その後、C#開発者はそれを使用できます。ただし、F#開発者はできません。そうです、F#は、消費できない演算子のオーバーロードを生成できます。
ジョナサンアレン

「このドキュメント」のリンクが壊れています...
Eduardo Brites 2013年

36

それは、ドライバーよりハンマーの利点が何であるかを尋ねるようなものです。非常に高いレベルでは、どちらも基本的に同じことを行いますが、実装レベルでは、達成しようとしていることに最適なツールを選択することが重要です。c#では難しく時間がかかるが、f#では簡単なタスクがあります。たとえば、ドライバーで釘を打つような作業です。あなたは確かにそれを行うことができます-それは理想的ではありません。

データ操作は、私が個人的にf#が本当に優れており、c#が扱いにくい可能性があることを示す1つの例です。反対に、(一般的に言えば)OO(c#)の方が機能的(f#)よりも複雑なステートフルUIの方が簡単です。(おそらく、F#で何かを行うのがいかに簡単かを「証明」することが「クール」であるため、これに反対する人もいるでしょうが、私はそれを支持しています)。他にも数え切れないほどあります。


22
ハンマーさえあれば釘のように見えます。-Maslow
チャーリーソルト

20
1つのデータの例を除いて、具体的な詳細が示されていないので、私はこれに賛成票を投じません。私はそれらが異なるツールであることを知っています。これら2つのツールがお互いに比べてどのジョブが最高で最悪かを尋ねています。私はフィリップスが仕事のためにしばしば最適なツールであることを知っています。
gradbot 2009年

3
彼があなたに賛成票を投じない場合は、私がします。:P +1
スペンサールポート2009年

14
ハンマーさえあれば、すべてが親指のように見えます。
Ed Power

6
私はgradbotに同意します。これは良い回答なので、私からの反対投票はありませんが、元の質問の詳細には行き着きません。この答えは漠然とした概念的な説明にすぎませんが、質問に正確に答えるという点を本当に逃しています。
スタンR.10年

27
  • 数学ではF#はC#よりもパフォーマンスが優れています
  • C#と同じソリューションでF#プロジェクトを使用できます(そして、あるプロジェクトから別のコールへ)
  • F#は、複雑なアルゴリズムプログラミング、金融、科学アプリケーションに最適です
  • F#は論理的には並列実行に最適です(C#よりもF#コードを並列コアで実行する方が簡単です)。

6
F#が数学でC#よりも優れたパフォーマンスを発揮することについて:どうやら、そうではありません。参照してくださいthoughtfulcode.wordpress.com/2010/12/30/...
ヨハ

3
@Joh:inlineC#が表現できないF#の大幅なパフォーマンス向上を提供できるものの明白な例です。
JD

@Jon Harrop:Rinatのブログエントリを具体的に参照していました。彼が得たF#を支持するタイミングは、次善のC#コードが原因だったようです。
ジョー

27

私が理解している質問に答えるには:C#を使用する理由 (あなたはすでにF#で販売されていると言います。)

最初に。「機能的オブジェクト指向」だけではありません。「Functional + OO対OO」です。C#の機能機能はかなり初歩的です。F#はそうではありません。一方、F#はC#のOO機能のほとんどすべてを実行します。ほとんどの場合、F#はC#の機能のスーパーセットになります。

ただし、F#が最良の選択ではない場合がいくつかあります。

  • 相互運用。F#からあまり快適ではないライブラリはたくさんあります。たぶん、F#が同じことをしない特定のC#OOのことを悪用したり、C#コンパイラの内部に依存している可能性があります。たとえば、式。F#の引用を簡単に式に変換することはできますが、結果は必ずしもC#が作成するものとは限りません。特定のライブラリにはこれに問題があります。

    • はい、相互運用はかなり大きなネットであり、一部のライブラリとの摩擦が発生する可能性があります。

    • 既存のコードベースが大きい場合は、相互運用性も含めることを検討します。F#でパーツの作成を開始するだけでは意味がない場合があります。

  • 設計ツール。F#には何もありません。何もないという意味ではありませんが、現在のところ、F#コードビハインドでWinFormsアプリを作成することはできません。ASPXページのようにサポートされている場合でも、現在IntelliSenseを取得していません。したがって、生成されたコードの境界となる場所を慎重に検討する必要があります。さまざまなデザイナーをほぼ独占的に使用する非常に小さなプロジェクトでは、「接着剤」またはロジックにF#を使用する価値はありません。大規模なプロジェクトでは、これはそれほど問題にならない場合があります。

    • これは本質的な問題ではありません。Rex Mの回答とは異なり、多くの変更可能なフィールドでUIを実行するのに優れているC#またはF#に本質的なものは何もありません。たぶん彼は、「可変」を書く必要があり、=の代わりに<-を使用するという余分なオーバーヘッドについて言及していました。

    • 使用するライブラリ/デザイナーにも依存します。すべてのコントローラーにF#を使用したASP.NET MVCを使用してから、C#Webプロジェクトを使用してASPXデザイナーを取得します。実際のASPX "コードインライン"は、そのページで必要なものに応じて、C#とF#の間で混合します。(IntelliSenseとF#タイプ。)

  • その他のツール。彼らはC#のみを期待していて、F#プロジェクトやコンパイルされたコードを処理する方法を知らない可能性があります。また、F#のライブラリは.NETの一部としては出荷されないため、出荷するのに少し余分があります。

  • しかし、一番の問題は?人。開発者の誰もがF#を学びたくない場合、またはさらに悪いことに、特定の側面を理解することが非常に困難な場合は、おそらく乾杯です。(ただし、その場合は、とにかく乾杯することをお勧めします。)ああ、そして経営者がノーと言ったら、それが問題になるかもしれません。

私はこれについて少し前に書きました:なぜF#ではないのですか?


6

手続き型言語と関数型言語の比較を求めているので、ここで質問に答えられると思います。手続き型プログラミングと関数型プログラミングの違いは何ですか?

MSがF#を作成した理由についての答えは単純です。.Netライブラリにアクセスできる関数型言語を作成することで、市場基盤が拡大しました。そして、構文がOCamlとほとんど同じであることを確認すると、実際にはそれほど大きな労力を必要としませんでした。


1
本当の質問は言語ではなくプログラミングパラダイムの比較についてであるというあなたの一般的な答えは正しいと思いますが、あなたが参照している質問の答えは少し浅いと思います。
Jeroen Huinink、2009年

もっと良い質問があれば、遠慮なく別の質問を提案してください。それは私がグーグル検索から見つけた最も高い評価のものです。
スペンサールポート09年

1
私は彼がF#はMicrsoftの側であまり努力を必要としなかったと言って、お尻のように聞こえるように親切にしようとしていたと思います。
マシュー・ホワイト、

マーケットベースコメントの+1。シンプルで、それにいくつかの真実があります。
gradbot 2009年

1
私は私の質問に答える他のリンクを買いません。C#は、新しいバージョンで多くの機能構成をサポートしています。
gradbot、2009年

5

F#は、C#、C ++、VBと比較する場合、まだ別のプログラミング言語ではありません。C#、C、VBはすべて命令型または手続き型プログラミング言語です。F#は関数型プログラミング言語です。

(命令型言語と比較した)関数型プログラミング言語の2つの主な利点は、1。副作用がないことです。これにより、プログラムのプロパティに関する数学的推論がはるかに簡単になります。2.その機能は一流の市民です。他の値と同じくらい簡単に、関数をパラメーターとして別の関数に渡すことができます。

命令型プログラミング言語と関数型プログラミング言語の両方に用途があります。私はまだF#で真剣な作業を行っていませんが、現在C#に基づいて製品の1つにスケジューリングコンポーネントを実装しており、F#で同じスケジューラーをコーディングして実験を行い、正しいかどうかを確認します実装は、同等のC#を使用するよりも簡単に検証できます。


4
-1。F#はマルチパラダイム(OO + FP)言語です。純粋な関数型言語だけが(Haskellのような)副作用を持ちませんが、F#は純粋ではありません。
Mauricio Scheffer

5

F#は基本的には関数型プログラミング言語のC ++です。彼らは、Objective Camlのほとんどすべての部分を保持し、本当に愚かな部分を含め、.NETからすべての悪いことをもたらすような方法で.NETランタイムの上に投げました。

たとえば、Objective Camlでは、nullの1つのタイプ、option <T>を取得します。F#を使用すると、3種類のnull、option <T>、Nullable <T>、および参照nullを取得できます。つまり、オプションがある場合は、最初に「なし」かどうかを確認する必要があり、次に「Some(null)」かどうかを確認する必要があります。

F#は古いJavaクローンJ#のようなもので、単に注目を集めるための粗末な言語です。一部の人々はそれを気に入るでしょう、それらの何人かはそれを使うことさえありますが、結局それはまだ20年前の言語がCLRに付け加えられています。


2
+1、これは冷酷な真実かもしれませんが、.NETを使用してVSで関数型言語を使用できることは依然として非常に満足しています
gradbot

1
Nullable <T>では、コンパイラーにマジックエイリアスを実行させる必要があることに同意します。"Some null"をNoneと同等にすることが常に機能するかどうかはわかりません-一部の相互運用コードはそれに依存している可能性があります。しかし、参照null?.NETの大きな穴をどのように回避しますか?すべての参照タイプをオプションにラップしますか?実際には、これは特定の相互運用シナリオでのみ問題となるようです。
MichaelGG 2009年

12
FWIW、私は数年間(世界中の他の誰よりも長い)F#で専門的にコーディングしてきましたが、この問題やSome nullどこのF#コードのコードも見たことがありません。人々が不満を感じるかもしれないすべてのものの中で、これはリストに載っていなければなりません...
JD

1
F#とC ++を比較するのは少し先の話です。C ++の多くの部分には、未定義または不明確なセマンティクスがあり、F#はシンプルで明確に定義されています。どの.NET言語でも同じ問題が発生するため、.NETランタイムの品質はF#に対して維持できません。
Joh、

1
@Jonのような2年以上のプロ向けF#プログラミングでは、「Some null」に関連する問題を見たことがありません。一方、私は.Netフレームワークの機能から多大な利益を得ています。
Marc Sigrist

5

私が最も好きな.NETの側面の1つはジェネリックです。F#で手続き型コードを記述したとしても、型推論の恩恵を受けることができます。汎用コードを簡単に記述できます。

C#では、デフォルトで具象コードを記述し、汎用コードを記述するために追加の作業を行う必要があります。

F#では、デフォルトで汎用コードを記述します。F#とC#の両方で1年以上プログラミングを行った後、F#で作成したライブラリコードは、C#で作成したコードよりも簡潔で汎用的であり、再利用性も高いことがわかりました。C#で一般的なコードを書く機会が多くないのは、おそらく必須の型注釈に目がくらんでいないためです。

ただし、好みやプログラミングスタイルによっては、C#を使用する方が望ましい場合もあります。

  • C#は型間の宣言の順序を強制せず、ファイルがコンパイルされる順序に影響されません。
  • C#には、型の推論のためにF#では許容できないいくつかの暗黙的な変換があります。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.