【发布时间】:2018-03-23 15:57:08
【问题描述】:
鉴于类型提供程序is not supported yet,我需要一些其他方便的方法来解析 F# 中的 YAML 文件。但是,由于类型提供程序非常棒,当我在互联网上搜索替代解决方案时,我发现很难找到其他任何东西。
在 F# 中解析配置文件的最简单方法是什么?考虑到类型提供程序不在讨论范围内?
使用库是可以的,但是那个库的接口越OO,在F#中使用就越不方便。
我也不需要完整的“将任何 yaml 反序列化为给定类型/对象图”;像 xpath 查询之类的东西,但对于 YAML 来说非常好;我只是不想读取流并手动解析它。
这是我当前的尝试,它在运行时失败,因为可区分类型联合 OneOfSeveral 没有默认构造函数。它需要一些特殊处理并不让我感到惊讶,但我不知道如何去做。
open System
open YamlDotNet.Serialization
[<CLIMutable>]
type SpecificThing = {
foo : string
bar : int
}
type OneOfSeveral = Thing of SpecificThing
[<CLIMutable>]
type Root = {
option : OneOfSeveral
}
[<EntryPoint>]
let main argv =
let yaml = @"---
option:
thing:
foo: foobar
bar: 17
"
let deserializer = DeserializerBuilder().Build()
let config = deserializer.Deserialize<Root>(yaml)
printfn "%A" config
0
我也不确定我想如何在 YAML 的类型联合中表示选择;我考虑了几个选项:
# omit the 'option' level completely
thing:
foo: foobar
bar: 17
# have a specific field to discriminate on
option:
type: thing
foo: foobar
bar: 17
最后,对我来说,拥有一个灵活的配置对象图比拥有一个漂亮的 YAML 文件更重要,所以不管怎样……
【问题讨论】:
-
我之前对 YamlDotNet 有过很好的体验,但我不知道它是否支持 .NET Core。对我来说,驱动因素是文档模型,将所有不同的节点类型封装在活动模式中非常简单,以便在 F# 中感觉更自在。
-
@scrwtp 有趣!在写这个问题之前,我尝试了 YamlDotNet(很短的时间),我很难弄清楚如何有效地使用它。也许您可以在答案中使用一些代码示例来概述您的方法?
-
我无法再访问该代码库,所以我将从头开始。如果您使用 MCVE 发布具体问题,我会看看。