Wie konvertiere ich implizit in gängige Supertypen in F # -Musterübereinstimmungen?

Problemzusammenfassung

Im Moment, in dem ich f # verwende, muss ich explizit einen Wert für den übergeordneten Typ seines Typs erzwingen, damit die Mustervergleichsausdrücke korrekt überprüft werden. Ich hätte am liebsten eine ordentlichere Vorgehensweise.

Beispie

Angenommen, ich habe eine Klassenhierarchie:

type Foo () =
    abstract member Value : unit -> string

type A (i:int) = 
    inherit Foo ()
        override this.Value () = i.ToString()

type B (s:string) = 
    inherit Foo ()
        override this.Value () = s

Ideally, und in einigen Programmiersprachen normalerweise, würde ich das Äquivalent des Folgenden schreiben:

let bar (i:int) : Foo =
    match i with
      | 1 -> B "one"
      | _ -> A i

Dieser Ausdruck kann jedoch nicht korrekt überprüft werden und gibt den Fehler "Es wurde erwartet, dass dieser Ausdruck den Typ Foo hat, hier jedoch den Typ B" aus. Ich verstehe nicht, warum der Compiler nicht über genügend Informationen verfügt, um einen gemeinsamen Supertyp für den Übereinstimmungsausdruck abzuleiten, und überprüfe dann, ob der gemeinsame Supertyp 'Foo' ist.

egenwärtig bin ich gezwungen, für jeden Fall des Mustervergleichs eine explizite Zwangsmaßnahme vorzusehen:

let bar2 (i:int) : Foo =
    match i with
      | 1 -> (B "one") :> Foo
      | _ -> (A i) :> Foo

Ich möchte dies vermeiden.

Weitere Hinweise

Intuition schlägt vor, dass dies ein Ergebnis eines allgemeineren Problems ist. Ich hätte allerdings gedacht, dass etwas, das so häufig ist wie der Mustervergleich, oder dass Anweisungen, die auch die gleiche Eigenschaft aufweisen, eine Typprüfungsregel haben, um allgemeine Supertypen zu berücksichtigen.Bevor jemand etwas vorschlägt - Ich schätze, dass dies funktionieren würde, wenn A oder B Objektausdrücke wären, aber mein reales Beispiel ist das Erstellen von Instanzen von C # -Klassen, bei denen es sich um normale Klassen handelt.Ist es für mich eine Möglichkeit, Funktionen zu deklarieren, um Typen implizit zu konvertieren, wie dies beispielsweise bei scala der Fall ist, sodass ich für das Modul, in dem ich diese Generation durchführe, automatische Konvertierungen durchführen kann?

ielen Dank für jede Hilfe zu diesem Them

Antworten auf die Frage(4)

Ihre Antwort auf die Frage