Istnieje kilka przypadków, kiedy F # rekordy zachowanie jest dla mnie dziwne:Dziwne zachowanie F # zapisów
Brak ostrzeżenia o dwuznaczności
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";}
Ostrzeżenie na rekordy dekonstrukcji zamiast budowy rekordy
Zamiast otrzymywać ostrzeżenie o tworzeniu rekordów w poprzednim przypadku, kompilator F # wydał ostrzeżenie o "dekonstrukcji" rekordów:
// 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
Zauważ, że nie ma ostrzeżenia z dopasowywanie wzorca (podejrzewam To dlatego, że wzory są zbudowane przy użyciu „wyrażeń budowlanych rekordy”, a nie „rekordy dekonstrukcji wyrażenie”):
match p with
| {Id = _; Name = "Foo"} -> printfn "case 1"
| {Id = 42; Name = _} -> printfn "case 2"
| _ -> printfn "case 3"
Rodzaj błąd wnioskowania z brakującym polem
F # kompilator wybierze drugi typ, a następnie spowoduje błąd, ponieważ brakuje pola Wiek!
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";}
brzydki składni dla „rekordy” dekonstrukcji
poprosiłem kilka koledzy z kopalni pytanie: „Co to jest kod chodzi?”
type Person = {Id: int; Name: string;}
let p = {Id = 42; Name = "Foo";}
// What will happend here?
let {Id = id; Name = name} = p
To było całkowite zaskoczenie dla wszystkich, że „id” i „name” są rzeczywiście „lwartościami” choć umieszczone w „prawej” w wyrażeniu. Rozumiem, że chodzi o coś więcej na osobiste preferencje, ale dla większości ludzi wydaje się dziwne, że w jednym przypadku wartości wyjściowe są umieszczone po prawej stronie wyrażenia.
Nie sądzę, że to wszystko to błędy, podejrzewam, że większość z tych rzeczy to w rzeczywistości funkcje.
Moje pytanie brzmi: Czy istnieje jakieś racjonalne uzasadnienie takiego mrocznego zachowania?
Dzięki, @pad. Rozumiem, że obecne zachowanie do podjęcia ostatniej definicji jest dobrze udokumentowane. Ale nadal wydaje mi się to dziwne. W tym przypadku wolę błąd lub ostrzeżenie. A co z moją sekcją "Błąd wnioskowania z brakującym polem"? Czy wydaje ci się to rozsądne? –