为何F#类型提供程序生成的类型无法作为函数参数使用?
问题原因与解决方案
你遇到的编译错误并非因为类型提供程序实例只能在同一作用域使用,核心问题是函数参数的类型声明错误。
错误根源
FSharp.Data的JsonProvider生成的类型中,你定义的Simple是整个类型提供程序的容器类型,它包含了解析方法(Parse)、Schema定义等工具逻辑;而Simple.Parse返回的实例,实际类型是Simple.Root——这个类型才对应你提供的JSON样本的结构,拥有Age和Name属性。你把函数参数类型写成Simple,自然找不到对应的属性。
修正后的代码
#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 } """) // 将参数类型改为 Simple.Root let print (s: Simple.Root) = printfn $"{s.Age}" printfn $"{s.Name}" print simple
补充说明
类型提供程序生成的实例完全可以跨作用域使用,只要你正确声明参数的实际类型(即Simple.Root),不管是在同一模块、不同模块甚至不同项目中,都能正常访问实例的属性。
内容的提问来源于stack exchange,提问作者Matthew MacFarland
相关产品推荐
相关产品推荐

