最近和很多TimeSpans一起工作,並且需要得到總和&的平均值。
但是,TimeSpan既不定義運算符get_Zero也不定義DivideByInt,因此Seq.sum和Seq.average不能直接用於此類型。下面無法編譯:現有的類型可以擴展到Seq.sum等嗎?
open System
type System.TimeSpan
with
static member Zero with get() = TimeSpan()
static member (/) (n:DateTime, d:int) = DateTime(n.Ticks/(int64) d)
let ts = [ TimeSpan(10L); TimeSpan(99L) ]
let sum = ts |> Seq.sum
let avg = ts |> Seq.average
- 錯誤:類型「時間跨度」不支持名爲「get_Zero」
- 錯誤任何運營商:類型「時間跨度」不支持名爲「DivideByInt」任何運營商
- 警告:擴展成員不能提供操作符重載。考慮將運算符定義爲類型定義的一部分。
是否有一些F#魔術可以在現有類型上定義這些運算符?
我知道下面的工作(應該是更有效地啓動),但我仍然好奇上面這樣我就可以把它添加到我的工具箱與其他類型的使用。
let sum = TimeSpan(ts |> Seq.sumBy (fun t -> t.Ticks))
let avg = TimeSpan(let len = ts |> Seq.length in sum.Ticks/int64 len)
'System.TimeSpan'是密封的,所以你不能繼承它。 – gradbot 2010-07-12 15:17:54