Merkwürdiges Verhalten von F # -Datensätzen

Es gibt einige Fälle, in denen mir das Verhalten von F # -Aufzeichnungen fremd ist:

Keine Warnung vor Mehrdeutigkeiten

type AnotherPerson = {Id: int; Name: string}
type Person = {Id: int; Name: string;}

// F# compiler will use second type without any complains or warnings
let p = {Id = 42; Name = "Foo";}

Warnung bei der Dekonstruktion von Datensätzen anstelle der Erstellung von Datensätzen

Anstatt im vorherigen Fall eine Warnung zur Datensatzkonstruktion zu erhalten, gab der F # -Compiler eine Warnung zur Datensatz- "Dekonstruktion" aus:

// Using Person and AnotherPerson types and "p" from the previous example!
// We'll get a warning here: "The field labels and expected type of this 
// record expression or pattern do not uniquely determine a corresponding record type"
let {Id = id; Name = name} = p

Beachten Sie, dass es beim Mustervergleich keine Warnungen gibt (ich vermute, dass dies der Fall ist, weil Muster mit "Records Construction Expressions" und nicht mit "Records Deconstruction Expressions" erstellt werden):

match p with
| {Id = _; Name = "Foo"} -> printfn "case 1"
| {Id = 42; Name = _} -> printfn "case 2"
| _ -> printfn "case 3"

Tippfehler mit fehlendem Feld

Der F # -Compiler wählt den zweiten Typ und gibt dann einen Fehler aus, weil das Feld Alter fehlt!

type AnotherPerson = {Id: int; Name: string}
type Person = {Id: int; Name: string; Age: int}

// Error: "No assignment given for field 'Age' of type 'Person'"
let p = {Id = 42; Name = "Foo";}

Hässliche Syntax für "Records Deconstruction"

Ich stellte mehreren Kollegen eine Frage: "Worum geht es in diesem Code?"

type Person = {Id: int; Name: string;}
let p = {Id = 42; Name = "Foo";}

// What will happend here?
let {Id = id; Name = name} = p

Das war eine völlige Überraschung für alle, dass "id" und "name" tatsächlich "lvalues" sind, obwohl sie an der "rechten Seite" des Ausdrucks stehen. Ich verstehe, dass es hier viel mehr um persönliche Vorlieben geht, aber für die meisten Menschen scheint es seltsam, dass in einem bestimmten Fall Ausgabewerte rechts vom Ausdruck stehen.

Ich denke nicht, dass dies alles Fehler sind, ich vermute, dass die meisten dieser Dinge tatsächlich Features sind.
Meine Frage ist:Gibt es einen Grund für ein derart obskures Verhalten?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage