Насколько я знаю, статические ограничения членов (которые используются функциями, такими как Seq.sum
) не могут обнаружить члены, которые добавляются расширениями типов (по сути, методами расширения), поэтому я не думаю, чтопрямой способ сделать это.
Лучший вариант, который я могу придумать, - создать простую обертку вокруг структуры System.TimeSpan
.Затем вы можете определить все необходимые члены.Код будет выглядеть так:
[<Struct>]
type TimeSpan(ts:System.TimeSpan) =
member x.TimeSpan = ts
new(ticks:int64) = TimeSpan(System.TimeSpan(ticks))
static member Zero = TimeSpan(System.TimeSpan.Zero)
static member (+) (a:TimeSpan, b:TimeSpan) =
TimeSpan(a.TimeSpan + b.TimeSpan)
static member DivideByInt (n:TimeSpan, d:int) =
TimeSpan(n.TimeSpan.Ticks / (int64 d))
let ts = [ TimeSpan(10L); TimeSpan(99L) ]
let sum = ts |> Seq.sum
let avg = ts |> Seq.average
Я назвал тип TimeSpan
, поэтому он скрывает стандартный тип System.TimeSpan
.Однако вам все равно нужно писать ts.TimeSpan
, когда вам нужен доступ к базовому типу системы, так что это не так хорошо, как могло бы быть.