Сначала я подумал, что это будет близко к тому, что вы хотели:
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.
Это все еще может быть приемлемым для ваших нужд ...