Ограниченные типы из провайдера типов (XmlProvider) - PullRequest
0 голосов
/ 18 октября 2018

Я получил большое значение от XmlProvider, поскольку он дает мне массу определений типов при загрузке XML или XSD.Однако рассмотрим этот XML:

<period>
    <start>01/01/2018</start>
    <end>02/02/2018</end>
</period>

Могу ли я спокойно побудить провайдера типов дать мне ограниченный тип данных, так что «конец» не может предшествовать «началу».Или, может быть, некоторые ограничения после того, как XmlProvider выполняет тяжелую работу?

1 Ответ

0 голосов
/ 19 октября 2018

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