是否可以将DivideByInt添加到现有类型?

时间:2015-06-02 15:26:05

标签: f#

根据TimeSpan值列表,我希望获得平均值TimeSpan。如果我能像这样写它会很优雅:

let durations = [TimeSpan.FromSeconds 4.; TimeSpan.FromSeconds 2.]
let avg = durations |> List.average

然而,编译器抱怨这个:

  

类型' TimeSpan'不支持运营商&DivaeByInt'

这是非常合理的,因为TimeSpan确实没有定义DivideByInt

要解决此问题,我尝试像这样扩展TimeSpan(在使用List.average之前):

type TimeSpan with
    static member DivideByInt (ts : TimeSpan) (i : int) = 
        (float ts.Ticks) / (float i) |> int64 |> TimeSpan.FromTicks

虽然这个实现似乎在直接使用时可以正常工作,但遗憾的是,在使用List.average时,编译器看起来并不高兴。

虽然我非常清楚我可以使用List.averageBy,或者只是编写自定义函数来计算TimeSpan值列表的平均值,但我认为这样做了如果可以写durations |> List.average,那就要优雅。

有没有办法启用该语法?

2 个答案:

答案 0 :(得分:2)

不,这是不可能的。见old question。从理论上讲,可以在F#的未来版本中实现它。

答案 1 :(得分:0)

当我尝试使用

重载op时
type TimeSpan with
member this.op_DivideByInt (ts : TimeSpan) (i : int) = 
    (float ts.Ticks) / (float i) |> int64 |> TimeSpan.FromTicks

let durations = [TimeSpan.FromSeconds 4.; TimeSpan.FromSeconds 2.]
let avg = durations |> List.average

我收到以下编译器警告: Extension members cannot provide operator overloads. Consider defining the operator as part of the type definition instead.

所以看起来我们无法做到这一点。