2009-04-28 9 views
7

私はまだF#をgrokkedしていないことを認めます。しかし、3万フィートの記述では、彼らは可変状態を持たないコードをテストすることについて簡単に話し続けています。これは静的メソッドと同じですか?C#でより静的なメソッドを使用することで、関数型プログラミング(F#)と同じ利点を得ることができますか?

私のコードのいくつかをすべての静的メソッドを持つクラスに書くことで、F#の利点を得ることができますか?

私はちょうど短い答えを探しています、私は全体の本がトピックに存在することを知っています。

答えて

8

あなたは確かにC#コードを書くことができますが、それは静的関数とは関係ありません。不変性は、自分自身のコピーを作成し、コピーを別にすることによってのみ状態が変化する構造体またはオブジェクトを持つようなものです。

3

いいえ、静的メソッドと同じではありません。初期化後に何も(ローカル、関数の引数、静的フィールド、インスタンスフィールド)を割り当てないと、可変状態になりません。クラスが不変になるように設計することで、いくつかの利点を得ることができます。

8

絶対に無関係で、不変性はメソッドが静的またはインスタンスであることとは関係ありません。 Stringは、不変クラスであり、非常に機能的な方法で、何も変更するのではなく、Stringクラスの新しいインスタンスを返すたくさんのインスタンスメソッドを持っています。

ファンクション分解を使用してF#をエミュレートしようとすることもできますが、これはまだかなり必須のコードです。

+0

ええと、これは別の質問につながります。同様に機能的な分解は何ですか? – MatthewMartin

+0

それはすべて非常に簡単です:http://en.wikipedia.org/wiki/Decomposition_(computer_science) –

+0

ただ関数(など)で作られた関数を使うのはいいデザインです。それは関数型プログラミングの機能ですか、それとも両方に機能するのでしょうか? – MatthewMartin

2

いいえ、2つの概念は無関係です。 C#の静的メソッドは、引き続き受信オブジェクトを通常どおり、refやoutを使用して変更することができます。

5

静的な機能モジュールとオブジェクトを別にして、C#3とlambdas、LINQなどを使用してF#の利点をいくつか得ることができます。私はF#での素敵な見つけることです:

  • 推論どこでも
  • 自動一般化(私はそれを手動で整理する必要はありませんので、型パラメータに追加されます)
  • 簡単不変
  • 簡単にミックスの間
  • パターンマッチング
  • ネストされた関数(軽量)判別組合のようなモジュールとクラス
  • タイプ
  • ファーストクラス関数(なし、C#の名前のデリゲートはカウントされません)
  • すべてが表現
  • 簡単関数合成だから、

だ、あなたはC#で、このの一部をやろうとすることができます。その一部はサポートされておらず、動作しません。残りは非常に醜い、非常に速くなる。

LINQとEnumerable拡張の暴かれた道を離れれば、おそらく苦痛の世界に終わるでしょう。

4

これまでの回答とは異なります。不変性と静的メソッドは厳密には技術的に関連していないかもしれませんが、私はF#を使用するとC#メソッドを静的にすることを奨励しています。

考え方はアナログです。不変なオブジェクトを処理する方が簡単です。なぜなら、状態の変更について心配する必要がないからです。同じ方法で、静的メソッドを使用するときに状態を心配する必要はありません(グローバルなシングルトンなどを使用しない限り...)。

+0

なぜ静的に不変性を表現したいのか不明です。 たとえば、x = y.gsub( 'a'、 'b')の代わりにx = String.gsub(y、 'a'、 'b')を使用するとします。 あなたにはまだ俳優がいることが多いようですので、通常の機能が必要です。 静的関数は通常、x.cmp(y)よりも悪くないようなString.cmp(x、y)など、明確なアクターが存在しないときに使用されます。 もちろん、例外的な状況があります。 –

+1

質問全体が、「私はこの方法が私の期待することを信用することができますか?」です。あなたのメソッドが本当に機能的なものであれば、その結果は引数の関数であり、それが参照する他の「外部」状態ではありません。この場合、引数のみに基づいてテストを実行し、メソッドを信頼できるものと見なすことができます。この意味で、静的でないクラスであっても、メソッドを静的に静的にすることができれば、私はそうするでしょう。 – Benjol

1

本当です。 C#でより静的な関数を使用するだけで、関数型プログラミングの利点を得ることはできません。 Howver、もしあなたがフードの下を見ていたら(Reflectorを使って)、私は単純なlet文が静的関数だと理解しています。言い換えれば、

//F# 
let a = 2 

は、私は混乱を理解することができます

//C# 
static int a() 
{ 
    return 2; 
} 

C#での機能のようなものです。

説明Leon Bambrickの "F#Eye for C#Guyプレゼンテーション"から抜粋

関連する問題