Существует несколько случаев, когда 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 # выберет второй тип и выдаст ошибку, потому что поле Возраста отсутствует!
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» и «имя» на самом деле «lvalues», хотя они поместили в «правой» части выражения. Я понимаю, что это гораздо больше касается личных предпочтений, но для большинства людей кажется странным, что в одном конкретном случае выходные значения располагаются в правой части выражения.
Я не думаю, что все это ошибки, я подозреваю, что большая часть этого материала на самом деле есть функции.
Мой вопрос: Существует ли какое-либо разумное позади такое неясное поведение?
Спасибо, @pad. Я понимаю, что текущее поведение для принятия последнего определения хорошо документировано. Но мне все же кажется странным. Я предпочитаю получать ошибку или предупреждение в этом случае. А как насчет моего раздела под названием «Ошибка ввода типа с отсутствующим полем»? Вам кажется разумным? –