Странное поведение F # записей
Есть несколько случаев, когда поведение F # записывает мне странное поведение:
Нет предупреждения о двусмысленности
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";}
Предупреждение о деконструкции записей вместо построения записей
Вместо получения предупреждения о построении записей в предыдущем случае, F # компилятор выдал предупреждение о «деконструкции» записей:
// 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
Обратите внимание, что при сопоставлении с образцом предупреждений нет (подозреваю, что это потому, что шаблоны строятся с использованием «выражений построения записей», а не с «выражением деконструкции записей»):
match p with
| {Id = _; Name = "Foo"} -> printfn "case 1"
| {Id = 42; Name = _} -> printfn "case 2"
| _ -> printfn "case 3"
Ошибка вывода типа с пропущенным полем
Компилятор F # выберет второй тип, а затем выдаст ошибку, потому что поле Age отсутствует!
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";}
Уродливый синтаксис для "деконструкции записей"
Я задал вопрос нескольким моим коллегам: «О чем этот код?»
type Person = {Id: int; Name: string;}
let p = {Id = 42; Name = "Foo";}
// What will happend here?
let {Id = id; Name = name} = p
Это было полной неожиданностью для всех, что «id» и «name» на самом деле являются «lvalues», хотя они расположены в «правой части» выражения. Я понимаю, что это гораздо больше касается личных предпочтений, но для большинства людей кажется странным, что в одном конкретном случае выходные значения размещаются с правой стороны выражения.
Я не думаю, что все это ошибки, я подозреваю, что большинство этих вещей на самом деле функции.
Мой вопрос:есть ли рациональное объяснение за таким неясным поведением?