【问题标题】:Constrained types from a type provider (XmlProvider)来自类型提供程序 (XmlProvider) 的约束类型
【发布时间】:2018-10-18 18:15:59
【问题描述】:

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

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

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

【问题讨论】:

    标签: f# f#-data


    【解决方案1】:

    在这种情况下,我会将其视为边缘情况,并将其视为“未经验证的模型”。因此,通常在 F# 中,我们会使用验证函数将未验证的模型转换为经过验证的模型。 (我通常使用Result&lt;'T, 'E&gt;。)

    let validateXmlDates xml =
        if xml.period.start > xml.period.end then
            Error "Period start must be before period end"
        else Ok xml
    

    现在,您所做的任何事情都应该期待 Result&lt;XmlType, string&gt;,这将允许您传递它并保证它符合您的要求。您也可以使用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
    

    【讨论】:

      猜你喜欢
      • 2016-10-12
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      • 2017-01-21
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 2022-10-06
      相关资源
      最近更新 更多