在这种情况下,我会将其视为边缘情况,并将其视为“未经验证的模型”。因此,通常在 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...)
相关阅读:Railway Oriented Programming (F# for Fun and Profit)
获得结果后,可以使用一个简单的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