Ich glaube, ich verstehe nicht ganz, wie F # Typen in Sequenzausdrücken und warum Typen nicht korrekt erkannt werden, auch wenn ich den Typ der Elemente direkt aus "Seq" angeben.Typ Rückschluss in Sequenzausdrücken in F #
Im folgenden F # -Code wir eine Basisklasse A und zwei abgeleiteten Klassen haben, B und C:
type A(x) =
member a.X = x
type B(x) =
inherit A(x)
type C(x) =
inherit A(x)
Wenn ich versuche, „Ausbeute“ ihre Instanzen in einer einfachen Sequenz Ausdrücke, bekomme ich zwei Fehler : da es nicht so trivial sein kann
// Doesn't work, but it makes sense.
let testSeq = seq {
yield A(0)
yield B(1) // Error, expected type: A
yield C(2) // Error, expected type: A
}
den Sinn machen kann, „gemeinsame“ Typen ableiten (Schnittstellen, glaube ich, kann diese Arbeit viel schwieriger machen). Allerdings können diese Fehler mit einem sicheren Guss festgesetzt:
// Works fine :)
let testSeqWithCast = seq {
yield A(0)
yield B(1) :> A
yield C(2) :> A
}
Was passiert, wenn ich nicht will Abgüsse benutzen? Ich versuchte, die Sequenztyp direkt von „seq“ zu spezifizieren, aber die Dinge scheinen nicht zu funktionieren:
// Should work, I think...
let testGenSeq = seq<A> {
yield A(0)
yield B(1) // Error, expected type: A
yield C(2)
}
Also, meine Frage ist: Gibt es eine Möglichkeit, Abgüsse zu vermeiden? Wenn nicht, gibt es einen Grund, warum die Angabe des Typs den Code nicht funktioniert?
Ich habe versucht, durch folgenden Links zu graben:
http://msdn.microsoft.com/en-us/library/dd233209.aspx http://lorgonblog.wordpress.com/2009/10/25/overview-of-type-inference-in-f/
Aber ich nichts brauchbares gefunden ...
Sie für jede Art von Antwort im Voraus Danke geben kann :)
Vielen Dank, übersah ich diese Aussage in der Dokumentation. Ich verstehe Ihren Standpunkt, aber es scheint mir immer noch eine seltsame Entscheidung zu sein ... Tatsächlich haben B und C A als Typ; Tatsächlich funktioniert der äquivalente Code, der in C# geschrieben ist (unter Verwendung von Rendite).In jedem Fall, nochmals vielen Dank für deine Antwort :) – pomma89
Danke für die Änderungen, ich denke, dass die Situation jetzt klar ist :) Während ich meinen ersten Kommentar zu deiner Antwort geschrieben habe, habe ich widerwillig Enter gedrückt und eine "halb geschriebene" Antwort wurde eingereicht: Ich habe das sofort abgeschlossen, aber Sie haben vielleicht den Teil erhalten. Es tut mir Leid! – pomma89
Ich habe meine Antwort mit einigen zusätzlichen Informationen bearbeitet, die helfen können, die explizite Upcasting-Regel in F # zu rechtfertigen. –