gpt4 book ai didi

f# - 来自类型提供程序 (XmlProvider) 的约束类型

转载 作者:行者123 更新时间:2023-12-04 23:05:26 25 4
gpt4 key购买 nike

我从 XmlProvider 中获得了巨大的值(value),因为它在我加载 XML 或 XSD 时为我提供了大量类型定义。但是,请考虑以下 XML:

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

我可以甜言蜜语让类型提供者给我一个受约束的数据类型,这样“结束”不能先于“开始”吗?或者在 XmlProvider 完成繁重的工作后加上一些约束?

最佳答案

在这种情况下,我会将其视为边缘情况,并将其视为“未经验证的模型”。因此,通常在 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

关于f# - 来自类型提供程序 (XmlProvider) 的约束类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52880181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com