f# - 为什么 F# 类型提供程序生成的类型不能用作函数参数?

标签 f#

我正在尝试设置一个 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 没有 AgeName 属性.

但是,如果我在创建简单实例后立即使用它而不尝试将其传递到函数中,则它可以正常工作。

#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.ASample.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/

相关文章:

F# 使用泛型类型作为模式鉴别器

f# - Floyd Warshall 使用 Alea GPU

F# ((*)2) 和 ((<<<)1) 行为不同

c# - F# 支持多核

f# - 在 C# 中实现具有 Unit 返回类型的 F# 接口(interface)成员

f# - 将整数列表转换为字符串

.net - F#:成对减少/聚合一个序列或列表

F# 结构元组与 BCL 元组类型

f# - 如何对 F# Map 集合中的值求和

javascript - F#/Clojure 到 Javascript : interaction with environment and javascript libraries