Кажется, что типы записей обязывают вас объявлять типы членов:
type Point = { X:int; Y:int }
Каково (или может быть) обоснование этого?
Кажется, что в F # вы можете (почти) всегда уходит без необходимости определять типы при кодировании.Это заставляет меня думать, что, возможно, существует сильная теоретическая база для этого ограничения.Это тот случай?
Ответ Роберту:
Я понимаю вашу точку зрения, но мне кажется, что рассуждения ошибочны.Давайте рассмотрим пример:
Давайте предположим, что F # позволяет нам определять элементы без типа:
type Point = { X; Y; }
Ваши рассуждения основаны на том факте, что это будет так, и можно найти вещи следующим образомв нашем коде:
let a = { X=1; y=2 } //(1)
let b = { X="1"; y="2" } //(2)
В этом случае у компилятора не будет выбора, кроме как определить (неявно) Point
как
type Point = { X:object; Y:object }
Теперь вы, вероятно,не только создавать записи, но и использовать их.С учетом вышесказанного, возможно, в вашем коде будет место, где вы попытаетесь трактовать членов Point как целые числа:
let z = a.X + 2 //ERROR. goes against what is seen in (2)
и другие, где вы будете рассматривать их как строки:
let w = A.X + "abc" //ERROR. goes against what is seen in (1)
Оба будут отмечать ошибки, поэтому даже если вы попытаетесь использовать взаимно несовместимые типы для членов записей, вы не сможете!Будут ли они каким-либо образом совместимы, и F # найдет для нас наименее возможный тип root для использования.
Здесь есть разумное замечание, что в отличие от того, что вы описываете
* 1032Вы когда-нибудь хотели, чтобы поле внезапно меняло свой тип при переходе от одной записи к другой?
типы записей не будут менять при переходе от одной записи к другой.В худшем случае может случиться так, что типы членов Record будут довольно общими (в худшем случае из типа Object).
Но это тот же риск, который вы берете на себя, когда пишете метод, который принимает только аргументы без типов!И это, как мы знаем, разрешено в F #.
Итак, если я не пропустил что-то здесь, вероятно, это не причина, по которой у вас есть для определения типов в записях.