我正在尝试设置一个 F# 函数,该函数采用由 FSharp.Data 类型提供程序为 JSON 生成的类型参数。这是使用文档中的简单示例的一次尝试。
#r "nuget: FSharp.Data,5.0.2"
open FSharp.Data
type Simple = JsonProvider<""" { "name":"John", "age":94 } """>
let simple = Simple.Parse(""" { "name":"Tomas", "age":4 } """)
let print (s:Simple) =
printfn $"{s.Age}"
printfn $"{s.Name}"
print simple
这不会编译,并且在我的 print
函数中 s
没有 Age
或 Name
属性.
但是,如果我在创建简单实例后立即使用它而不尝试将其传递到函数中,则它可以正常工作。
#r "nuget: FSharp.Data,5.0.2"
open FSharp.Data
type Simple = JsonProvider<""" { "name":"John", "age":94 } """>
let simple = Simple.Parse(""" { "name":"Tomas", "age":4 } """)
printfn $"{simple.Age}"
printfn $"{simple.Name}"
类型提供程序生成的类型的实例是否仅限于在创建它们的同一范围内使用?
最佳答案
对于 JSON 类型提供程序,Simple
是一种实际上并不表示 JSON 文件中任何数据的类型。它基本上只是类型提供程序需要为 JSON 中的各个记录生成的所有不同类型的占位符。
顶级记录名为Root
,并且是Simple
的嵌套类型,因此以下内容有效:
let print (s:Simple.Root) =
printfn $"{s.Age}"
printfn $"{s.Name}"
这些类型的名称由类型提供者“猜测”,通常基于包含它们的记录的名称。在更复杂的示例中,将有两种不同的类型(Sample.A
和 Sample.Root
),您可以将两者用作参数(您只需要弄清楚哪个类型)其中之一来自 IDE 工具提示):
type Simple = JsonProvider<"""{ "a": { "name":"John", "age":94 } }""">
let simple = Simple.Parse(""" { "a": { "name":"Tomas", "age":4 } }""")
let print (s:Simple.A) =
printfn $"{s.Age}"
printfn $"{s.Name}"
print simple.A
关于f# - 为什么 F# 类型提供程序生成的类型不能用作函数参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76010054/