F# コードの構成: 型とモジュール 質問する

F# コードの構成: 型とモジュール 質問する

関数をモジュール内に記述するか、何らかの型の静的メンバーとして記述するかをどのように決定しますか?

たとえば、F# のソース コードには、次のように、同じ名前のモジュールとともに定義された型が多数あります。

type MyType = // ...

[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
module MyType = // ...

操作を MyType 型の静的メンバーとして定義するだけではいかがでしょうか?

ベストアンサー1

技術的な違いに関するいくつかの注意事項を次に示します。

モジュールは「オープン」にできる(RequireQualifiedAccessAttributeがない限り)。つまり、関数(FおよびG)をモジュール(M)に配置すると、次のように記述できます。

open M
... F x ... G x ...

一方、静的メソッドの場合は、常に次のように記述します。

... M.F x ... M.G x ...

モジュール関数はオーバーロードできませんモジュール内の関数はletで束縛されており、letで束縛された関数はオーバーロードを許可しません。両方を呼び出せるようにしたい場合は、

X.F(someInt)
X.F(someInt, someString)

member型の を使用する必要があります。これは、「修飾された」呼び出し (例:type.StaticMember(...)またはobject.InstanceMember(...)) でのみ機能します。

(他にも違いはあるのでしょうか?思い出せません。)

これらが、どちらかを選択する際に影響する主な技術的な違いです。

さらに、F# ランタイム (FSharp.Core.dll) には、F# 固有の型 (通常は他の .Net 言語との相互運用を行うときには使用されない) と、より言語中立な API の静的メソッドにのみモジュールを使用する傾向があります。たとえば、カリー化されたパラメーターを持つすべての関数はモジュール内に表示されます (カリー化された関数は、他の言語から呼び出すのが簡単ではありません)。

おすすめ記事