私はまだ F# を理解していないことを認めます。しかし、30,000 フィートの説明では、変更可能な状態を持たないテストが容易なコードについて話し続けています。それは静的メソッドと同じですか?
すべての静的メソッドを持つクラスでコードの一部を記述することで、F# の利点を得ることができますか?
私は短い答えを探しているだけです。このトピックに関する本全体が存在することは知っています。
私はまだ F# を理解していないことを認めます。しかし、30,000 フィートの説明では、変更可能な状態を持たないテストが容易なコードについて話し続けています。それは静的メソッドと同じですか?
すべての静的メソッドを持つクラスでコードの一部を記述することで、F# の利点を得ることができますか?
私は短い答えを探しているだけです。このトピックに関する本全体が存在することは知っています。
確かに C# コードを不変に書くことはできますが、それは静的関数とは関係ありません。不変性とは、それ自体のコピーを作成してコピーを異なるものにすることによってのみ「状態を変更する」構造体またはオブジェクトを持つようなものです。
不変性は、メソッドが静的またはインスタンスであることとは何の関係もありません。String
は不変クラスであり、多くのインスタンス メソッドがあり、非常に機能的な方法で、String
何かを変更するのではなく、クラスの新しいインスタンスを返します。
機能分解を使用して F# をエミュレートすることもできますが、これは依然としてかなり命令的なコードになります。
オブジェクトに対する静的な機能モジュールとは別に、C# 3 とラムダ、LINQ などを使用して、F# の利点をいくつか得ようとすることができます。F# でいいと思うのは、次のとおりです。
したがって、C# でこれをいくつか実行することができます。一部は単にサポートされておらず、機能しません。残りは非常に醜く、非常に速くなります。
そのため、LINQ と Enumerable 拡張機能の常套手段から大きく外れると、おそらく苦痛の世界に陥ることになります。
これまでの他のすべての回答とは異なります。不変性と静的メソッドは厳密には技術的に関連していない可能性がありますが、F# を使用することで、できる限り C# メソッドを静的にすることが奨励されていることがわかりました。
状態が変化することを心配する必要がないため、不変オブジェクトを処理する方が簡単であるという点で、考え方は類似しています。同様に、静的メソッドを使用する場合は、状態を気にする必要はありません (グローバル シングルトンなどを使用しない限り...)。
いいえ、静的メソッドとは異なります。初期化後に何も割り当てない場合 (ローカル、関数の引数、静的フィールド、インスタンス フィールド)、変更可能な状態はありません。クラスを不変に設計することで、いくつかの利点を得ることができます。
いいえ、2 つの概念は無関係です。C# の静的メソッドは、受信オブジェクトを通常どおり変更でき、他の変数は ref または out を使用して変更できます。
それは本当です。C# でより多くの静的関数を使用するだけでは、関数型プログラミングの利点は得られません。ただし、ボンネットの下を見ると (たとえば、Reflector を使用して)、単純な let ステートメントが静的関数であることがわかります。言い換えると、
//F#
let a = 2
C#の関数のようなものです
//C#
static int a()
{
return 2;
}
混乱は理解できます。
レオン・バンブリックの「F# Eye for the C# Guy プレゼンテーション」から引き出された説明。