Ich brauche folgende Beziehung zu beschreiben:F # Kovarianz und Kontra in Aufzeichnungen
type FieldDef<'Object, 'Val> {
Name: string;
Resolve: 'Object -> 'Val
}
type ObjectDef<'Object> {
Name: string;
Fields: FieldDef<'Object, _> list
}
// example usage
type MyRecord = { X: int; Y: string; }
let myRecordDef = {
Name = "MyRecord"
Fields = [
{ Name = "x"; Resolve: fun r -> r.X }
{ Name = "y"; Resolve: fun r -> r.Y }
]
}
Leider _
in diesem Anwendungsfall nicht gültig ist. Der zweite Param-Typ von FieldDef
kann in diesem Fall variieren - in C# könnten wir ihn als kontravariant annotieren und an den Typ Object
binden. Wie kann ich ein ähnliches Ergebnis in F # erreichen, ohne viel von der Typensicherheit zu verlieren?
Warum nicht nur zwei Variablen vom Typ Objektdef nehmen machen –
Wie ich schon sagte, der zweite Typ-Parameter kann unterschiedlich sein, d. H. Felder sollten sowohl 'Field' und 'Field ' akzeptieren. Ich habe die Frage mit Beispiel aktualisiert, um den gewünschten Effekt besser zu beschreiben. –
Horusiath
Ich vermute, dass Sie in diesem Fall krank sind, ohne Typsicherheit. –