簡體   English   中英

F#中的通用模塊

[英]Generic modules in F#

在C#中,我可以編譯

static class Foo<T> { /* static members that use T */ }

結果是通用的,不可實例化。

什么是等效的F#代碼? module<'a>不編譯, type Foo<'a>是可實例化的。

到目前為止,其他答案都有部分圖片......

type Foo<'a> private() =          // '
    static member Blah (a:'a) =   // '
        printfn "%A" a

是很棒的。 忽略Reflector生成的內容,你不能在F#程序集中實例化這個類(因為構造函數是私有的),所以這很好用。

F#也允許使用靜態構造函數,語法是在類中包含'static let'和'static do'語句(類似於'let'和'do'如何作為實例的主構造函數體的一部分工作) 。 一個完整的例子:

type Foo<'a> private() =             // '
    static let x = 0
    static do printfn "Static constructor: %d" x
    static member Blah (a:'a) =      // '
        printfn "%A" a

//let r = new Foo<int>() // illegal
printfn "Here we go!"
Foo<int>.Blah 42
Foo<string>.Blah "hi"

我一開始以為這會接近你想要的東西:

type Foo<'a> private() =   
    static member Blah (a:'a) =
       printfn "%A" a

就像只能通過反射或類本身(希望不會這樣做)實例化的成語前c#2.0。

但是這被編譯為:

[Serializable, CompilationMapping(SourceConstructFlags.ObjectType)]
public class Foo<a>
{
    internal Foo() {...}

    public static void Blah(a a) {...}
}

這意味着f#程序集中的其他類可以實例化它。

然而,知情的Brian已經指出f#編譯器尊重這個私有設置,盡管底層的CLR類型意味着實例化的唯一方法是通過反射或使用類似InternalsVisibleTo屬性的東西。

這可能仍然可以滿足您的需求......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM