私は、製品の出荷よりもプロトタイピングを行うテクノロジー企業で働いています。C#とF#の違いは何ですか、なぜMSがF#を作成したのか、どのシナリオがC#より優れているのかを尋ねられました。
私はしばらくこの言語を使用しており、F#の優れた機能について簡単に説明できるので気に入っていますが、C#で他の言語を使用する理由を説明する経験がありません。
C#vs F#またはF#vs C#を使用する利点は何ですか?
私は、製品の出荷よりもプロトタイピングを行うテクノロジー企業で働いています。C#とF#の違いは何ですか、なぜMSがF#を作成したのか、どのシナリオがC#より優れているのかを尋ねられました。
私はしばらくこの言語を使用しており、F#の優れた機能について簡単に説明できるので気に入っていますが、C#で他の言語を使用する理由を説明する経験がありません。
C#vs F#またはF#vs C#を使用する利点は何ですか?
回答:
命令型言語に対する関数型プログラミングの一般的な利点:
F#などの関数型プログラミング言語では、多くの問題をはるかに簡単に、定義に近づけ、より簡潔に定式化でき、コードはエラーが発生しにくくなります(不変性、より強力な型システム、直感的な再帰アルゴリズム)。コンピュータがあなたに言ってほしいことの代わりにあなたが何を意味するかをコード化することができます;-) あなたがそれをグーグルするとき、またはSOでそれを検索するときさえ、このような多くの議論を見つけるでしょう。
特別なF#の利点:
-式を使用すると、非同期プログラミングが非常に簡単で直感的になりますasync {}
-ParallelFXを使用しても、対応するC#コードははるかに大きくなります
コンパイラコンパイラとドメイン固有言語の非常に簡単な統合
必要に応じて言語を拡張する:LOP
より柔軟な構文
多くの場合、より短く、よりエレガントなソリューション
このドキュメントをご覧ください
C#の利点は、関数型プログラミング言語よりも「命令型」アプリケーション(ユーザーインターフェイス、命令型アルゴリズム)の方が正確であることが多く、使用する.NET-Frameworkは命令型に設計されており、より広く普及していることです。
さらに、F#とC#を1つのソリューションにまとめることができるため、両方の言語の利点を組み合わせて、必要な場所で使用できます。
それは、ドライバーよりハンマーの利点が何であるかを尋ねるようなものです。非常に高いレベルでは、どちらも基本的に同じことを行いますが、実装レベルでは、達成しようとしていることに最適なツールを選択することが重要です。c#では難しく時間がかかるが、f#では簡単なタスクがあります。たとえば、ドライバーで釘を打つような作業です。あなたは確かにそれを行うことができます-それは理想的ではありません。
データ操作は、私が個人的にf#が本当に優れており、c#が扱いにくい可能性があることを示す1つの例です。反対に、(一般的に言えば)OO(c#)の方が機能的(f#)よりも複雑なステートフルUIの方が簡単です。(おそらく、F#で何かを行うのがいかに簡単かを「証明」することが「クール」であるため、これに反対する人もいるでしょうが、私はそれを支持しています)。他にも数え切れないほどあります。
inline
C#が表現できないF#の大幅なパフォーマンス向上を提供できるものの明白な例です。
私が理解している質問に答えるには: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#ではないのですか?
手続き型言語と関数型言語の比較を求めているので、ここで質問に答えられると思います。手続き型プログラミングと関数型プログラミングの違いは何ですか?
MSがF#を作成した理由についての答えは単純です。.Netライブラリにアクセスできる関数型言語を作成することで、市場基盤が拡大しました。そして、構文がOCamlとほとんど同じであることを確認すると、実際にはそれほど大きな労力を必要としませんでした。
F#は、C#、C ++、VBと比較する場合、まだ別のプログラミング言語ではありません。C#、C、VBはすべて命令型または手続き型プログラミング言語です。F#は関数型プログラミング言語です。
(命令型言語と比較した)関数型プログラミング言語の2つの主な利点は、1。副作用がないことです。これにより、プログラムのプロパティに関する数学的推論がはるかに簡単になります。2.その機能は一流の市民です。他の値と同じくらい簡単に、関数をパラメーターとして別の関数に渡すことができます。
命令型プログラミング言語と関数型プログラミング言語の両方に用途があります。私はまだF#で真剣な作業を行っていませんが、現在C#に基づいて製品の1つにスケジューリングコンポーネントを実装しており、F#で同じスケジューラーをコーディングして実験を行い、正しいかどうかを確認します実装は、同等のC#を使用するよりも簡単に検証できます。
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に付け加えられています。
Some null
どこのF#コードのコードも見たことがありません。人々が不満を感じるかもしれないすべてのものの中で、これはリストに載っていなければなりません...
私が最も好きな.NETの側面の1つはジェネリックです。F#で手続き型コードを記述したとしても、型推論の恩恵を受けることができます。汎用コードを簡単に記述できます。
C#では、デフォルトで具象コードを記述し、汎用コードを記述するために追加の作業を行う必要があります。
F#では、デフォルトで汎用コードを記述します。F#とC#の両方で1年以上プログラミングを行った後、F#で作成したライブラリコードは、C#で作成したコードよりも簡潔で汎用的であり、再利用性も高いことがわかりました。C#で一般的なコードを書く機会が多くないのは、おそらく必須の型注釈に目がくらんでいないためです。
ただし、好みやプログラミングスタイルによっては、C#を使用する方が望ましい場合もあります。