F#类型提供程序,它们是如何工作的

F#类型提供程序,它们是如何工作的,f#,type-providers,F#,Type Providers,在看了don Symes的pdc视频后,我不太了解类型提供者 我理解得对吗。你可以为Twitter、Excel等提供现成的类型提供程序 如果我有一个自定义Xml结构,我需要实现自己的类型提供程序吗?这与创建自己的自定义映射程序有何不同。对于本例,假设它是一个电子表格 我们还假设您有一些方法来获取/推断该数据的模式/元数据-也就是说,您可以知道类型(例如,双精度对字符串)和关系(例如,此列表示“工资”)以及元数据(例如,此表用于2009年6月的预算) 类型提供程序允许您编写一种“垫片库”,了解某

在看了don Symes的pdc视频后,我不太了解类型提供者

我理解得对吗。你可以为Twitter、Excel等提供现成的类型提供程序


如果我有一个自定义Xml结构,我需要实现自己的类型提供程序吗?这与创建自己的自定义映射程序有何不同。对于本例,假设它是一个电子表格

我们还假设您有一些方法来获取/推断该数据的模式/元数据-也就是说,您可以知道类型(例如,双精度对字符串)和关系(例如,此列表示“工资”)以及元数据(例如,此表用于2009年6月的预算)

类型提供程序允许您编写一种“垫片库”,了解某种数据实体(例如电子表格),并将该库用作编译器/IDE工具链的一部分,以便您可以编写类似以下内容的代码

mySpreadsheet.ByRowAndColumn.C4
或者别的什么,然后获取智能感知(自动完成)和工具提示(例如,将单元格C4描述为Bob的薪水)以及静态键入(例如,将其设置为双精度或字符串或其他形式)。从本质上讲,这为您提供了静态类型对象模型的工具支持,并利用了各种动态或代码生成系统的易用性,这两个系统都有一些改进。“成本”是必须有人编写垫片库(“类型提供程序”),但许多这样的提供程序非常通用(例如说OData、Excel、WMI或其他语言的提供程序)因此,少数类型提供程序库通过静态类型和一流的工具支持,在您的编程语言中提供了世界上大量的数据

该体系结构是一个开放编译器,提供者作者在其中实现一个小接口,允许他们将新名称/类型注入编程上下文。类型提供程序可能只是传递给编译器的另一个库(项目中的引用,
-r
-ed),带有额外的元数据,将其标记为参与开发的编译/IDE/codegen部分的类型提供程序


我不知道xml示例中的“自定义映射器”到底是什么来进行比较。

我知道这是一个老问题,但现在类型提供程序可用(随着F#3.0的发布)。还有一份白皮书对此进行了解释。我们有一个微软的代码,可以让你看到引擎盖下

类型提供程序使用F#的引用作为(有效的)编译器插件,可以在编译时基于元数据生成代码

这允许您(例如)读入一些JSON、数据库模式、XSD或其他内容,然后生成F#类来对元数据表示的域进行建模


关于创建它们,我写了几篇博客文章,可能从开始就感兴趣。

你有没有关于类型提供程序何时可用的信息?感谢custom mapper,我指的是将xml文件映射到强类型对象模型的库。我看不出这样的库和类型提供程序库之间有什么大的区别,因为可以为XSD文件编写一个类型提供程序,并且您可以对任何与任何XSD兼容的XML文件进行强类型、可发现的访问,无需编写映射器或对象模型。还要注意的是,我假设“自定义映射器”涉及“代码生成”(这是它自己的包袱),并且是xml的特定工具。然而,类型提供程序是一种开放机制,任何人都可以使用相同的接口/机制为任何类型的数据编写提供程序,而不是依赖于特定域/数据的一组固定的唯一工具。类型提供程序实际上与IL发射器无关(生成类型提供程序可以使用一个作为实现细节,但擦除提供程序根本不处理IL)。就我从ProviderdTypes.fs中所见,即使在删除提供程序时,您为方法和属性提供的引用代码在添加到程序集中时也会转换为IL。当然,类型本身不是。我现在没有时间进一步研究它,但这会让我感到惊讶-原始API是专门设计的编译器使用类似
(| ProvidedCallExpr | | |)的模式
在中定义,从提供程序获取引用并将其包装,然后在中的
ConvertProviderExpressionToExprandWitness
中将其转换为适当的AST节点。@kvb我相信您在这方面是正确的-我已将答案修改为匹配。我以前误解了提供的一些类型代码。