В этом случае я бы рассматривал это как крайний случай и считал бы его «непроверенной моделью».Таким образом, обычно в F # мы будем использовать функцию проверки, чтобы превратить эту непроверенную модель в проверенную модель.(Я обычно использую Result<'T, 'E>
для этого.)
let validateXmlDates xml =
if xml.period.start > xml.period.end then
Error "Period start must be before period end"
else Ok xml
Теперь все, что вы делаете, должно ожидать Result<XmlType, string>
, что позволит вам передать его с гарантией того, что оно соответствует вашим требованиям.Вы также можете использовать Result.bind
для цепочки проверок 1 :
Ok xml
|> Result.bind (validateXmlDates)
|> Result.bind (validateXml...)
|> Result.bind (validateXml...)
Несколько связанных с этим чтений: Железнодорожно-ориентированное программирование (F # для удовольствия и прибыли)
Получив результаты, можно использовать тривиальный match
для запуска следующего шага:
match validatedXml with
| Ok xml -> ...
| Error str -> ...
Затем вы выполните следующий логический шаг в ветви Ok
и обработаете ошибки.в ветке Error
.
1: Result.bind (fn)
фактически является сокращением для следующего:
match result with
| Error e -> Error e
| Ok v -> fn v