7

静的メソッドはC#よりもF#で人気があるように見えることに気づきました。C#では、インスタンスメソッドを呼び出して、常にコレクションに要素を追加します。

mySet.Add(elem);

ただし、F#には通常、同等の静的メソッドがあります。

mySet.Add(elem)
// OR
Set.Add elem mySet

そして、私は後者の形をサンプルでかなり頻繁に見ました。どちらも意味的にも機能的にも完全に同一であるように見えますが、C#のバックグラウンドから来ているため、インスタンスメソッドを使用する方が自然に感じられます。F#でより良いスタイルとその理由はどれですか?

4

4 に答える 4

8

型推論に関連するその回答で述べられている理由に加えて、関数スタイルでは、関数をパラメーターとして送信する方が自然です。インスタンスメソッドの場合は、次のように記述する必要があります。

myHigherOrderFunction (fun (x:MyType) -> x.myFunctionAsMethod)

ただし、静的メソッドとして定義されている場合は、次のように記述できます。

myHigherOrderFunction MyType.myFunctionAsMethod

これは、よりエレガントで、書き込みが簡単で(読み取りも)、通常のletbound関数を送信する場合とほぼ同じ構文です。

インスタンスメソッドは、関数(メソッド)にアクセスするために型のインスタンスを必要とします。OOPではオブジェクトにメッセージを送信すると考えるのでこれは問題ではありませんが、FPでは関数のみ(インスタンスなし)が第一級市民です。

クラスを指定する必要がある静的メソッドにアクセスするには、クラスを関数を備えた一種のコンテナー(モジュールや名前空間など)として見ることができます。

于 2012-08-01T19:59:46.837 に答える
5

標準のF#タイプのほとんどは不変です。不変オブジェクトを操作する場合、静的メソッドは何が起こっているかをより適切に表現します。たとえば、次のようになります。

mySet.Add(elem);

F#セットが新しいを返す場合、mySetを含むように変更されているように見えます。幸いなことに、F#は、この間違いをしないようにコンパイルできません。それでも、コードが混乱する可能性があります。対照的に:elemmySet

mySet |> Set.Add elm

形がはっきりしていて、元の物から離れすぎずに、何か新しいものを返すように見えます。

于 2012-08-01T20:55:34.337 に答える
2

F#の静的メソッドは非常に一般的ですが、インスタンスメソッドはコンポーネント開発に非常に適していることがわかりました。

理由?F#モジュールシステムにはファンクターがありません。SMLやOCamlなどの他のフレーバーのMLでは、コンポーネントを単純なモジュールとして開発します。後でモジュールをパラメーター化することにした場合は、ソースコードを書き直さずに、モジュールをファンクターに昇格させることができます。F#ではできません。

F#でパラメーター化された「モジュール」を作成するには、クラスに頼ってメソッドをインスタンスメソッドに変換し、インスタンスの構築中にパラメーターを渡す必要があります。残念ながら、モジュールからクラスへの移行には、かなりの機械的ですが厄介なソースコードの変更が伴います。したがって、ハードコアコンポーネントプログラマーは、C#の場合と同様に、デフォルトでクラスとインスタンスメソッドを操作することを選択する場合があります。これは、SMLで時々使用される「ファンクターのみ」のスタイルを彷彿とさせます。

于 2012-08-01T23:57:50.043 に答える
0

関数型言語としてのf#では、不変の変数と操作である関数を分離するためによりネイティブです。これはc#の静的メソッドと同様に機能しますが、c#メソッドの前に関数の利点が1つあります。部分適用です。一部の(すべてではない)パラメーターを関数に渡すことができ、パラメーターの一部を含むこの関数は、他のパラメーターを必要とする新しい関数になります。

于 2012-08-01T19:43:19.443 に答える