He estado trabajando con un montón de TimeSpans recientemente, y necesito obtener sumas & promedios.
Sin embargo, TimeSpan no define ni el operador get_Zero ni DivideByInt, por lo que Seq.sum y Seq.average no se pueden usar directamente con este tipo. La siguiente falla al compilar:¿Se pueden extender los tipos existentes para que funcionen con Seq.sum, etc.?
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
- de error: El tipo 'TimeSpan' no admite ningún operadores nombrados 'get_Zero'
- de error: El tipo 'TimeSpan' no admite ningún operadores nombrados 'DivideByInt'
- Advertencia: los miembros de la extensión no pueden proporcionar sobrecargas al operador. Considere definir al operador como parte de la definición de tipo en su lugar.
¿Hay alguna magia F # que pueda definir estos operadores en un tipo existente?
Sé que lo siguiente funcionará (y debería ser más eficiente para arrancar), pero todavía siento curiosidad por lo anterior, así que puedo agregarlo a mi caja de herramientas para usar con otros tipos.
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' está sellado por lo que tampoco puede heredar de él. – gradbot