从语言实现的角度来看,要像F# 3.0中那样实现类型提供程序,需要什么?

8
F# 3.0增加了类型提供程序type providers,使得手动编写或生成DB(或其他数据提供程序)与语言/类型系统之间的映射基本上是不必要的,因为语言可以直接使用类型提供程序从数据库本身查询结构信息。

从语言实现的角度来看,向一种语言添加这样的特性需要什么?

它是否需要完全可插拔的类型系统?还是更像编译器中集成的某些隐藏代码生成器?

要为F#实现新的类型提供程序,需要什么?


关于最后一行,请参见您链接的页面:“必要时,您可以创建自己的自定义类型提供程序,或引用其他人创建的类型提供程序。” - Marc Gravell
这个标签是C#,但它明显与C#无关。已移除该标签。 - Chris Moschini
4个回答

14

从技术上讲,你可以将F#类型提供程序视为编译器的“插件”。编译器不再生成映射关系,而是询问类型提供程序:“你知道哪些类型?”或“你知道这个类型吗?”(根据上下文而定)。

插件(即类型提供程序)会回答并指定类型的样子(抽象地,而非实际生成)。然后编译器使用此信息,并且稍后请求类型提供程序在编译使用这些“虚假”类型的代码时提供应该使用的代码。还可以实际生成代码(一些示例这样做,因为它们只是使用已经存在的工具)。

因此,是的,您可以自己实现类型提供程序。我在GOTO Copenhagen talk中说了一些关于它的事情,这个talk已被记录,Don Syme也在他早期的talks中说了一些话(我还没有看过他的BUILD talk)。


3

1

查看 ITypeProvider 和 IProvidedNamespace 的 MSDN 文档,我找不到用于定义类型的实际方法的文档,例如 ProvidedTypeDefinition(x,y,z) 和 ProvidedPropertyDefinition(x,y,z)。

也许可以在这里找到 http://fsharp3sample.codeplex.com/SourceControl/changeset/view/8670#195262

从示例中可以看出,您可以指定提供的类型派生自已知基类,但是是否可以指定提供的类型实现一个或多个现有接口呢?如果您还可以提供实现的方法体,那么这似乎是您想要能够做到的事情。


1

由于此页面存在,可能是可能的。但是您正在引用当前处于测试阶段的事物,因此事物可能会发生变化。

根据我理解的可用文档,推断类型将是强类型,因此我认为这更多是编译器的问题而不是语言问题(除了一些语法之外)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接