Используйте записи (называемые типами продуктов в теории функционального программирования) для сложных данных, которые описываются несколькими свойствами, такими как запись базы данных или какой-либо объект модели:
type User = { Username : string; IsActive : bool }
type Body = {
Position : Vector2<double<m>>
Mass : double<kg>
Velocity : Vector2<double<m/s>>
}
Используйте размеченные объединения (называемые типами сумм) для данных, возможные значения которых можно перечислить. Например:
type NatNumber =
| One
| Two
| Three
...
type UserStatus =
| Inactive
| Active
| Disabled
type OperationResult<'T> =
| Success of 'T
| Failure of string
Обратите внимание, что возможные значения для размеченного значения объединения также являются взаимоисключающими — результатом операции может быть либо Success
, либо Failure
, но не оба одновременно.
Вы можете использовать тип записи для кодирования результата операции, например:
type OperationResult<'T> = {
HasSucceeded : bool
ResultValue : 'T
ErrorMessage : string
}
Но в случае сбоя операции это ResultValue
не имеет смысла. Таким образом, сопоставление с образцом в размеченной версии объединения этого типа будет выглядеть так:
match result with
| Success resultValue -> ...
| Failure errorMessage -> ...
И если вы сопоставите шаблон с версией типа записи нашего типа операции, это будет иметь меньше смысла:
match result with
| { HasSucceeded = true; ResultValue = resultValue; ErrorMessage = _ } -> ...
| { HasSucceeded = false; ErrorMessage = errorMessage; ResultValue = _ } -> ...
Это выглядит многословно и неуклюже, и, вероятно, менее эффективно. Я думаю, когда у вас возникает такое чувство, это, вероятно, намек на то, что вы используете неправильный инструмент для задачи.
person
MisterMetaphor
schedule
25.06.2013