私は、製品の出荷よりもプロトタイピングを行うハイテク企業で働いています。 C#とF#の違い、MSがF#を作成した理由、C#よりも優れているシナリオを尋ねました。
私はしばらくの間この言語を使用しており、F#の優れた機能について簡単に話を進めることができますが、C#の経験が不足しているため、なぜ他の言語を使用する必要があるのかを説明できません。
C#対F#またはF#対C#を使用する利点は何ですか?
命令型言語に対する関数型プログラミングの一般的な利点:
F#のような関数型プログラミング言語では、多くの問題をはるかに簡単に、その定義に近く、より簡潔に定式化でき、コードはエラーを起こしにくい(不変性、より強力な型システム、直感的な再帰アルゴリズム)。コンピューターがあなたに言いたいことの代わりに、あなたが意味することをコーディングすることができます;-)グーグルで検索したり、SOで検索したりすると、このような多くの議論を見つけるでしょう。
特別なF#の利点:
非同期プログラミングはextremelyで簡単かつ直感的に async {}
- expressions -ParallelFXでも対応するC#コードずっと大きいです
非常に簡単な統合 コンパイラコンパイラとドメイン固有の言語
必要に応じて言語を拡張します。 LOP
より柔軟な構文
多くの場合、より短く、よりエレガントなソリューション
このドキュメント をご覧ください
C#の利点は、関数型プログラミング言語よりも「命令型」アプリケーション(ユーザーインターフェイス、命令型アルゴリズム)の方が正確であることが多いこと、C#が使用する.NETフレームワークが命令型で設計されていること、そしてより普及していることです。
さらに、1つのソリューションでF#とC#を一緒に使用できるため、両方の言語の利点を組み合わせて、必要な場所で使用できます。
それは、ドライバーよりもハンマーの利点を尋ねるようなものです。非常に高いレベルでは、どちらも本質的に同じことを行いますが、実装レベルでは、達成しようとしているものに最適なツールを選択することが重要です。 C#では難しいが時間がかかるが、f#では簡単なタスクがあります。たとえば、ドライバーで釘を打つなどです。あなたは確かにそれを行うことができます-それは単に理想的ではありません。
データ操作は、私が個人的にf#が本当に輝いていて、c#が扱いにくい場所を指し示すことができる1つの例です。一方、(一般的に言えば)OO(c#)の複雑なステートフルUIは、機能(f#)よりも簡単です。 (おそらく、F#ではanythingがいかに簡単かを "証明"するのが "クール"であるため、これに反対する人もいるかもしれませんが、私はそれを支持しています)。他にも無数にあります。
私が理解しているようにあなたの質問に答えるには:なぜC#を使用するのですか? (あなたはすでにF#で販売されていると言います。)
最初に。 「機能対オブジェクト指向」だけではありません。 「Functional + OO vs 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#の本質的なものは見当たりません。たぶん彼は、「可変」を記述し、=の代わりに<-を使用しなければならないという余分なオーバーヘッドに言及していたのかもしれません。
また、使用するライブラリ/デザイナーによって異なります。 ASP.NET MVCとF#をすべてのコントローラーで使用し、次にC#Webプロジェクトを使用してASPXデザイナーを取得するのが大好きです。そのページで必要なものに応じて、C#とF#の間に実際のASPX「コードインライン」を混在させます。 (IntelliSense対F#タイプ。)
その他のツール。彼らはただC#を期待しているだけで、F#プロジェクトやコンパイルされたコードの扱い方を知らないかもしれません。また、F#のライブラリは.NETの一部として出荷されないため、出荷するためにもう少し余分なものがあります。
しかし、一番の問題は?人。開発者の誰もがF#を学びたくない、またはさらに悪いことに、特定の側面を理解するのが非常に難しい場合は、おそらく乾杯です。 (とはいえ、私はあなたがとにかく乾杯していると主張します。)ああ、そしてもし経営陣がノーと言ったら、それは問題かもしれません。
私はこれについて少し前に書きました: Why NOT F#?
手続き型言語と関数型言語の比較を求めているので、ここで質問に答えられると思います: 手続き型プログラミングと関数型プログラミングの違いは何ですか?
MSがF#を作成した理由については、答えは簡単です。Netライブラリにアクセスできる関数型言語を作成すると、市場基盤が拡大します。そして、構文がどのようにOCamlとほぼ同じであるかを見ると、実際にはそれほど労力を必要としませんでした。
F#は基本的に関数型プログラミング言語のC++です。彼らは、本当にバカな部分を含め、Objective Camlのほとんどすべてを保持し、.NETのすべての悪いことも取り込むように.NETランタイムの上にそれを投げました。
たとえば、Objective Camlでは、1つのタイプのnull、option <T>を取得します。 F#では、3つのタイプのnull、option <T>、Nullable <T>、および参照nullを取得します。これは、「なし」であるかどうかを最初に確認する必要があるオプションがある場合、「Some(null)」であるかどうかを確認する必要があることを意味します。
F#は古いJavaクローンJ#に似ていますが、単に注目を集めるためだけのろくでなしの言語です。一部の人々はそれを愛し、一部の人々はそれを使用しますが、最終的にはまだ20年前の言語がCLRに組み込まれています。
F#をC#、C++、VBと比較している場合、F#はまだ別のプログラミング言語ではありません。 C#、C、VBはすべて命令型または手続き型プログラミング言語です。 F#は関数型プログラミング言語です。
関数型プログラミング言語の2つの主な利点は(命令型言語と比較して)1.副作用がないことです。これにより、プログラムのプロパティに関する数学的推論がはるかに簡単になります。 2.関数はファーストクラスの市民です。他の値と同様に、関数を別の関数にパラメーターとして渡すことができます。
命令型プログラミング言語と関数型プログラミング言語の両方に用途があります。私はまだF#で真剣な仕事をしていませんが、現在C#に基づいた製品の1つにスケジューリングコンポーネントを実装しており、同じスケジューラーをF#でコーディングして実験を行い、実装は、C#の同等のものよりも簡単に検証できます。
私が最も気に入っている.NETの側面の1つはジェネリックです。 F#で手続き型コードを記述しても、型推論の恩恵を受けることになります。汎用コードを簡単に記述できます。
C#では、デフォルトで具体的なコードを記述しますが、一般的なコードを記述するために追加の作業を行う必要があります。
F#では、デフォルトで汎用コードを記述します。 F#とC#の両方で1年以上プログラミングを行った後、F#で記述したライブラリコードは、C#で記述したコードよりも簡潔で汎用的であり、したがって再利用性も高いことがわかりました。おそらく必須の型注釈に目がくらんでいるため、C#で汎用コードを書く機会を多く逃しています。
ただし、好みやプログラミングスタイルによっては、C#を使用することが望ましい状況があります。