32

F#でオーバーロード可能なメンバーを含む静的クラスを定義することは可能ですか?letモジュールバインディングは、静的クラスの静的静的メンバーにコンパイルされていても、オーバーロードできません。

typeデクレレーションには静的メンバーを含めることができますが、タイプ自体を静的にすることができるかどうかはわかりません。

type私の現在の解決策は、プライベートコンストラクターでを定義し、それを使用することです。静的型を好きなように定義できる方法があるのだろうかと思います。

4

5 に答える 5

45

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#の場合と同じようにインスタンスメソッドを追加してもコンパイラエラーは発生しませんが、呼び出し元の観点からは違いはありません。

于 2012-11-16T15:14:09.643 に答える
9

これについては、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の答えはこれまでのところ最良のアドバイスのようですが、将来的には状況が変わる可能性があります。

于 2016-12-25T18:49:41.957 に答える
5

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

inline3番目に、キーワードを使用して、これらのオーバーロードされたメソッドの制約をlet-boundsに伝播します。

let inline ( |+| ) m1 m2 = (Overloads $ m1) m2

このメソッドを使用してlet-boundsをオーバーロードできる場合は、これらの関数を保持し、タイプをマークするラッパーモジュールを作成する必要がありますprivate

于 2012-10-27T16:45:09.523 に答える
5

静的クラスのようなものがあるかどうかはわかりません。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

だから、あなたが今していることはそれをする方法です。

于 2012-10-27T23:11:12.017 に答える
-4

ここでの問題は、F#をC#にしようとしていることだと思います。命令型ではない方法で問題を解決できない場合は、C#を使用するか、オブジェクト指向ライブラリを作成してF#で使用してください。

于 2012-10-30T20:08:51.573 に答える