F#でオーバーロード可能なメンバーを含む静的クラスを定義することは可能ですか?let
モジュールバインディングは、静的クラスの静的静的メンバーにコンパイルされていても、オーバーロードできません。
type
デクレレーションには静的メンバーを含めることができますが、タイプ自体を静的にすることができるかどうかはわかりません。
type
私の現在の解決策は、プライベートコンストラクターでを定義し、それを使用することです。静的型を好きなように定義できる方法があるのだろうかと思います。
Robert Jeppesonが指摘したように、C#の「静的クラス」は、インスタンス化または継承できないクラスを作成するための省略形であり、静的メンバーのみを持ちます。F#でそれを正確に実現する方法は次のとおりです。
[<AbstractClass; Sealed>]
type MyStaticClass private () =
static member SomeStaticMethod(a, b, c) =
(a + b + c)
static member SomeStaticMethod(a, b, c, d) =
(a + b + c + d)
とプライベートコンストラクターの両方でクラスのインスタンスを作成できないため、これは少しやり過ぎかもしれませんがAbstractClass
、これはC#静的クラスが行うことです-プライベートコンストラクターを使用して抽象クラスにコンパイルされます。このSealed
属性は、このクラスから継承できないようにします。
この手法では、C#の場合と同じようにインスタンスメソッドを追加してもコンパイラエラーは発生しませんが、呼び出し元の観点からは違いはありません。
これについては、F#コンポーネントの設計ガイドラインで説明されています。
[<AbstractClass; Sealed>]
type Demo =
static member World = "World"
static member Hello() = Demo.Hello(Demo.World)
static member Hello(name: string) = sprintf "Hello %s!" name
let s1 = Demo.Hello()
let s2 = Demo.Hello("F#")
インスタンスメソッドを定義することは引き続き可能ですが、使用可能なコンストラクターがない場合、クラスをインスタンス化することはできません。
2021年1月の編集:Abelからのコメントとリンクされた問題を参照してください。Joel Muellerの答えはこれまでのところ最良のアドバイスのようですが、将来的には状況が変わる可能性があります。
F#で静的型を定義する機能はありません。
最初の選択肢はモジュールを定義することですが、それは関数をオーバーロードする機能を欠いています(これはあなたが求めているものです)。2番目の方法は、静的メンバーを使用して通常の型を宣言することです。
2番目のアプローチに関しては、それはまさにあなたの古い質問に対する受け入れられた答えが説明したものです。簡単に説明できるように、コードをリファクタリングします。最初に、ダミーの単一ケースの識別されたユニオンが定義されます。
type Overloads = Overloads
次に、静的メンバーがオーバーロードされる可能性があるという事実を利用します。
type Overloads with
static member ($) (Overloads, m1: #IMeasurable) = fun (m2: #IMeasurable) -> m1.Measure + m2.Measure
static member ($) (Overloads, m1: int) = fun (m2: #IMeasurable) -> m1 + m2.Measure
inline
3番目に、キーワードを使用して、これらのオーバーロードされたメソッドの制約をlet-boundsに伝播します。
let inline ( |+| ) m1 m2 = (Overloads $ m1) m2
このメソッドを使用してlet-boundsをオーバーロードできる場合は、これらの関数を保持し、タイプをマークするラッパーモジュールを作成する必要がありますprivate
。
静的クラスのようなものがあるかどうかはわかりません。C#のクラスレベルでの「静的」は2.0で導入されたと思いますが、これは主に利便性のためです(プライベートコンストラクターや、インスタンスメンバーが存在しないことをコンパイル時にチェックすることは避けてください)。タイプを調べて静的であると結論付けることはできません:http://msdn.microsoft.com/en-us/library/system.reflection.typeinfo.aspx
更新:MSDNは、静的クラスは封印され、静的メンバーのみを持つクラスであると宣言しています:http: //msdn.microsoft.com/en-us/library/79b3xss3 (v=vs.80).aspx
だから、あなたが今していることはそれをする方法です。
ここでの問題は、F#をC#にしようとしていることだと思います。命令型ではない方法で問題を解決できない場合は、C#を使用するか、オブジェクト指向ライブラリを作成してF#で使用してください。