Ich versuche folgendes:F # - Wie erweitere ich einen Typ mit get_Zero, damit ich einen vorhandenen Typ generisch verwenden kann?
let c x = System.Numerics.Complex(x, 0.0)
let sum = [c 1.0; c 2.0] |> List.sum
Aber ich bekomme diese Fehlermeldung:
The type 'System.Numerics.Complex' does not support the operator 'get_Zero'
ich die Regeln auf Typerweiterungen zu lesen, von https://msdn.microsoft.com/en-us/library/dd233211.aspx, und versuchen Sie Folgendes zu tun:
module ComplexExtension =
let c x = System.Numerics.Complex(x, 0.0)
type System.Numerics.Complex with
// I also tried a bunch of other ways of writing these
// as static or instance members, but nothing worked
static member Zero = c 0.0
static member One = c 1.0
open ComplexExtension
let sum = [c 1.0; c 2.0] |> List.sum
Ich bekomme immer noch diesen Fehler.
Ist es möglich, einen Typ mit dem Operator get_Zero zu erweitern? Oder muss ich meinen eigenen Wrapper-Typ um System.Numerics.Complex
erstellen und alle Operatoren überschreiben, wenn ich möchte, dass es die anderen Dinge tut, die komplexe Zahlen tun?
Ja, wahrscheinlich Wrapper erstellen ist ein Weg zu gehen. Siehe hier: http://stackoverflow.com/questions/3223660/can-existing-types-be-extended-to-work-with-seq-sum-etc – Petr
Das Ding, das Sie suchen, heißt "höher-kinded Polymorphismus ", und leider unterstützt F # es im Allgemeinen nicht. Hier ist eine Benutzer-Sprachanfrage, bitte stimme: http: //fslang.uservoice.com/forums/245727-f-sprache/vorschläge/5664242-simulieren-höher-kinded-polymorphismus –