Chcę zaimplementować IEnumerable<KeyValuePair<DateTime, 'T>>
w mojej własnej klasie i dodać operatorów matematyki do tej klasy, aby operatorzy mogli pracować jak funkcja inline na dowolnych numerycznych typach 'T
- automatycznie dodawali ograniczenia.f # Statycznie rozdzielone typy w elementach typu
Po prostu nie mogę wykonać następującego kodu. Nie działa on bez słowa kluczowego "inline" w deklaracji członkowskiej.
Ponadto, jeśli zdefiniować funkcję
let inline add l r = l + r
przed rodzaju i używać go zamiast dodawania l.Value + r.Value, to również nie działa.
Czy ktoś mógłby mi pokazać, co robię źle?
Prawdopodobnie całe podejście jest złe i istnieje sposób na osiągnięcie tego samego celu w inny sposób?
namespace Test
open System
open System.Linq
open System.Collections.Generic
[<SerializableAttribute>]
type TimeSeries<'T>(dictionary : IDictionary<DateTime, 'T>) =
let internalList = new SortedList<DateTime, 'T>(dictionary)
interface IEnumerable<KeyValuePair<DateTime, 'T>> with
member this.GetEnumerator() = internalList.GetEnumerator()
member this.GetEnumerator() : Collections.IEnumerator
= internalList.GetEnumerator() :> Collections.IEnumerator
member private this.sl = internalList
static member inline (+) (left : TimeSeries<'T>, right : TimeSeries<'T>) =
let res =
query {
for l in left do
join r in right on
(l.Key = r.Key)
select (l.Key, l.Value + r.Value)
}
new TimeSeries<'T>(res |> dict)
Oto najprostsza odpowiedź na pytanie, które znam: http://tomasp.net/blog/fsharp-generic-numeric.aspx Skomplikowany temat. –