从语言实现的角度来看,向一种语言添加这样的特性需要什么?
它是否需要完全可插拔的类型系统?还是更像编译器中集成的某些隐藏代码生成器?
要为F#实现新的类型提供程序,需要什么?
从语言实现的角度来看,向一种语言添加这样的特性需要什么?
它是否需要完全可插拔的类型系统?还是更像编译器中集成的某些隐藏代码生成器?
要为F#实现新的类型提供程序,需要什么?
从技术上讲,你可以将F#类型提供程序视为编译器的“插件”。编译器不再生成映射关系,而是询问类型提供程序:“你知道哪些类型?”或“你知道这个类型吗?”(根据上下文而定)。
插件(即类型提供程序)会回答并指定类型的样子(抽象地,而非实际生成)。然后编译器使用此信息,并且稍后请求类型提供程序在编译使用这些“虚假”类型的代码时提供应该使用的代码。还可以实际生成代码(一些示例这样做,因为它们只是使用已经存在的工具)。
因此,是的,您可以自己实现类型提供程序。我在GOTO Copenhagen talk中说了一些关于它的事情,这个talk已被记录,Don Syme也在他早期的talks中说了一些话(我还没有看过他的BUILD talk)。
查看 ITypeProvider 和 IProvidedNamespace 的 MSDN 文档,我找不到用于定义类型的实际方法的文档,例如 ProvidedTypeDefinition(x,y,z) 和 ProvidedPropertyDefinition(x,y,z)。
也许可以在这里找到 http://fsharp3sample.codeplex.com/SourceControl/changeset/view/8670#195262。
从示例中可以看出,您可以指定提供的类型派生自已知基类,但是是否可以指定提供的类型实现一个或多个现有接口呢?如果您还可以提供实现的方法体,那么这似乎是您想要能够做到的事情。
由于此页面存在,可能是可能的。但是您正在引用当前处于测试阶段的事物,因此事物可能会发生变化。
根据我理解的可用文档,推断类型将是强类型,因此我认为这更多是编译器的问题而不是语言问题(除了一些语法之外)。