Странное поведение 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», хотя они расположены в «правой части» выражения. Я понимаю, что это гораздо больше касается личных предпочтений, но для большинства людей кажется странным, что в одном конкретном случае выходные значения размещаются с правой стороны выражения.

Я не думаю, что все это ошибки, я подозреваю, что большинство этих вещей на самом деле функции.
Мой вопрос:есть ли рациональное объяснение за таким неясным поведением?

Ответы на вопрос(2)

Ваш ответ на вопрос