Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 带静态约束的泛型类型的F#singleton_Generics_F# - Fatal编程技术网

Generics 带静态约束的泛型类型的F#singleton

Generics 带静态约束的泛型类型的F#singleton,generics,f#,Generics,F#,我想知道是否有可能为带有静态约束的泛型类型创建一个单例(下面的第三种类型将不会编译)。将inline添加到第三种类型的成员不起作用。非常感谢 type A private () = static let instance = A () static member Instance = instance member this.DoNothing (x : int) = 0 type GenericA<'B> private () = static

我想知道是否有可能为带有静态约束的泛型类型创建一个单例(下面的第三种类型将不会编译)。将
inline
添加到第三种类型的成员不起作用。非常感谢

type A private () = 
    static let instance = A ()
    static member Instance = instance
    member this.DoNothing (x : int) = 0


type GenericA<'B> private () =
    static let instance = GenericA<'B> ()
    static member Instance = instance
    member this.DoNothing (x : 'B) = 0


type GenericWithStaticConstraintA<'B when 'B : (static member MyMember : Unit -> int)> private () =
    static let instance = GenericWithStaticConstraintA<'B> ()
    static member Instance = instance
    member this.DoNothing (x : 'B) = 0
type A private()=
静态let实例=A()
静态成员实例=实例
成员this.DoNothing(x:int)=0
泛型()
静态成员实例=实例
成员this.DoNothing(x:'B)=0
类型GenericWithStaticConstraintA int)>private()=

static let instance=GenericWithStaticConstraintA您可以通过
inline
关键字对静态成员的类使用静态解析的类型约束

type GenericWithStaticConstraintA< ^B when ^B : (static member MyMember : unit -> int)> =
    static member inline DoNothing(x : ^B) = 0

您也可以对实例成员(
memberinline\uuu.DoNothing(x:^B)=0
)执行此操作,但这有什么意义呢?

问题在于单例。我提到添加内联是不起作用的。一旦将其添加到原始示例中,编译就开始在
静态成员inline Instance=Instance
上失败。无论如何,我找到了我需要的任务的解决方法。将在静态构造函数中创建一个通用实例,
static let
编译成类似
Script1.GenericWithStaticConstraintA GenericWithStaticConstraintA=new Script1.GenericWithStaticConstraintA()。这在构造函数之外有多有用,除非您提供一个具体类型,类似于模块级的实例化?您是否愿意展示您的解决方法并自己回答您的问题?为什么不使用具有Mymember的接口,该接口由'B'实现?
type Foo = Foo with static member MyMember() = 42
type Bar = Bar with static member MyMember = fun () -> 42
GenericWithStaticConstraintA.DoNothing(Foo)
GenericWithStaticConstraintA.DoNothing(Bar) // The type 'Bar' does not support the operator 'MyMember'