Универсальные модули в F # - PullRequest
6 голосов
/ 31 июля 2009

В C # я могу скомпилировать

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

Результат является общим и не может быть создан.

Что такое эквивалентный код F #? module<'a> не компилируется, а type Foo<'a> является экземпляром.

Ответы [ 2 ]

9 голосов
/ 31 июля 2009

Остальные ответы до сих пор имеют часть картины ...

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"
2 голосов
/ 31 июля 2009

Сначала я подумал, что это будет близко к тому, что вы хотели:

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

Быть похожим на идиому pre c # 2.0 того, чтобы быть инстанцируемым только посредством отражения или самим классом (который, мы надеемся, этого не сделает).

однако это скомпилировано в:

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

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

Что означает, что другие классы в сборке f # могут создавать его экземпляры.

Однако постоянно информированный Брайан указал, что компилятор f # уважает этот закрытый параметр, несмотря на базовый тип CLR, что означает, что единственный способ создания экземпляра будет через отражение или с помощью чего-то вроде атрибута InternalsVisibleTo.

Это все еще может быть приемлемым для ваших нужд ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...