如何使用具有静态解析类型参数的静态扩展方法?

时间:2017-08-05 20:59:03

标签: f# operators extension-methods

我想使用静态解析的类型参数以及我添加到内置类型的一些扩展方法,例如float32int32,所以我尝试了以下内容:

module Foo =
    type System.Single with
        static member Bar x = x + 1.0f

    let inline bar (x : ^a) =
        (^a : (static member Bar : ^a -> ^a) x)

open Foo
[<EntryPoint>]
let main argv =
    System.Console.WriteLine (bar 1.0f) (* Compilation fails here *)
    0

编译器抱怨The type 'float32' doesn't support the operator 'Bar'。我做错了什么?

1 个答案:

答案 0 :(得分:7)

静态解析的类型参数无法解决扩展方法,因此无法使用此特定方法。

我建议仔细考虑这是否是您真正需要做的事情,或者您是否可以用不同的方式表达您试图解决的问题。

如果您确定这是您想要的并且您愿意勇敢接下来的龙,那么有一种解决方法,包括使用一些静态方法创建一个帮助器类型:

type Ext = Ext
    with
        static member Bar (ext : Ext, flt : float) = 1.0 + flt
        static member Bar (ext : Ext, flt : float32) = 1.0f + flt

然后,您可以使用静态解析的类型参数定义新函数,如下所示:

let inline bar (x : ^a) =
    ((^b or ^a) : (static member Bar : ^b * ^a -> ^a) (Ext, x))

然后你可以写:

bar 7.0f
val it : float32 = 8.0f

bar 5.0
val it : float = 6.0