Записи против единичных дискриминированных союзов
Какие плюсы и минусы использования
type Complex =
{
real: float;
imag: float;
}
или же
type Complex =
Complex of
real: float *
imag: float
Я особенно заинтересован в удобочитаемости и обработке в разных ситуациях.
И в меньшей степени производительность.
2 ответа
Используя вспомогательные функции, вы можете получить то же самое из обоих подходов.
запись
type ComplexRec =
{
real: float
imag: float
}
// Conciseness
let buildRec(r,i) =
{ real = r ; imag = i }
let c = buildRec(1.,5.)
// Built-in field acces
c.imag
Союз тип
type ComplexUnion =
Complex of
real: float * imag: float
// Built-in conciseness
let c = Complex(1.,5.)
// Get field - Could be implemented as members for a more OO feel
let getImag = function
Complex(_,i) -> i
getImag c
Я полагаю, что (частая) декомпозиция типа объединения может влиять на производительность, но я не эксперт по этому вопросу.
В случае типа записи, допустим, вы объявили символ it : Complex
у вас есть немедленный доступ к обоим полям, как: it.real, it.imag
В случае распознаваемого объединения (DU) сначала необходимо распаковать тип DU, например:
match it with
| Complex (real, imag) -> real, imag
DU имеет смысл, когда у вас есть выбор по типу. Тип Complex не подходит для нескольких случаев, он имеет только одну возможную форму case.
В этом случае я предпочитаю тип записи, поскольку он дает более читаемый код при использовании.