通过类型提供程序创建通用类型

时间:2016-10-26 14:11:36

标签: f# type-providers

是否可以通过类型提供程序创建泛型类型,以便

[<TypeProvider>]
type SampleTypeProvider(config: TypeProviderConfig) as this = 

...
//the below would be the generated type
type A<'b> () = 
     member this.C() : 'b = ...
     member this.D() : 'b = ...
//
...
[<assembly:TypeProviderAssembly>] 
do()
  ....

以便在使用场景中看起来像

#r @".\bin\Debug\SampleTypeProvider.dll"
type A = SampleTypeProvider.A
type intA = A<int>
type strA = A<str>

如果可能的话 - 我该如何处理它。

1 个答案:

答案 0 :(得分:4)

使用标准方法无法做到这一点。我试着环顾四周,但找不到规范的参考,但这是一个已知的限制,并且有各种建议来解除限制。

Ross McKinlay有一个名为Mixin type provider的极端项目,通过在运行类型提供程序时实际生成带有F#源代码的文件(然后您可以在项目中包含此文件)来解决此问题。这可能比类型提供者更多代码生成,但他的talk about the topic也是对某些限制的一个很好的解释。

如何解决这个问题很大程度上取决于类型提供者的目的。如果您只需要有限数量的类型,则可以使用类似静态参数的内容并编写A<"int">A<"string">。您还可以将普通的非提供泛型类型与非泛型提供的类型混合在一起(以某种巧妙的方式)。但我认为你需要写更多关于你的具体用例以获得更好的答案。