f # Statisch aufgelöste Typen in Typmembern

8

Ich möchte IEnumerable<KeyValuePair<DateTime, 'T>> in meiner eigenen Klasse implementieren und mathematische Operatoren zu dieser Klasse hinzufügen, so dass die Operatoren wie eine Inline-Funktion für alle numerischen Typen von 'T arbeiten können - fügt automatisch Beschränkungen hinzu.

Ich kann das folgende Code-Stück einfach nicht funktionieren lassen. Es funktioniert weder mit noch ohne 'inline' Schlüsselwort bei der Member-Deklaration.

Auch wenn ich eine Funktion definiere

%Vor%

vor dem Typ und verwenden Sie es anstelle von Zusatz l.Value + r.Value, es funktioniert auch nicht.

Könnte mir bitte jemand zeigen, was ich falsch mache?

Wahrscheinlich ist der ganze Ansatz falsch und es gibt einen Weg, um das gleiche Ziel auf die andere Weise zu erreichen?

%Vor%     
V.B. 24.12.2012, 18:45
quelle

1 Antwort

6

Ihre Vorgehensweise scheint mir richtig zu sein. Der Grund, warum Ihr Code nicht kompiliert, ist, weil F # -Typ-Inferenz eine statische Constraint (Kompilierzeit) für die Typvariable 'T ableitet, die dieselbe ist, die für die Typdefinition verwendet wird.

Ein generischer Parameter einer Typdefinition kann nicht statisch aufgelöst werden (keine "Hat" -Typen), aber nichts hindert Sie daran, eine Funktion oder ein Member zu definieren, die diese Kompilierungsbedingungen verwenden.

Ändern Sie einfach Ihre Typvariable 'T in 'U in der Definition des statischen Members (+) und es wird in Ordnung sein.

Sie dürfen weiterhin eine TimeSeries Instanz eines Typs erstellen, der (+) nicht unterstützt (dh: TimeSeries<obj> ), aber Sie können (+) für diese Instanzen sowieso nicht verwenden, wenn Sie tun es, Sie erhalten eine schöne Fehlermeldung zur Kompilierzeit.

    
Gustavo 25.12.2012, 21:58
quelle

Tags und Links