是否可以通过类型提供程序创建泛型类型,以便
[<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>
如果可能的话 - 我该如何处理它。
答案 0 :(得分:4)
使用标准方法无法做到这一点。我试着环顾四周,但找不到规范的参考,但这是一个已知的限制,并且有各种建议来解除限制。
Ross McKinlay有一个名为Mixin type provider的极端项目,通过在运行类型提供程序时实际生成带有F#源代码的文件(然后您可以在项目中包含此文件)来解决此问题。这可能比类型提供者更多代码生成,但他的talk about the topic也是对某些限制的一个很好的解释。
如何解决这个问题很大程度上取决于类型提供者的目的。如果您只需要有限数量的类型,则可以使用类似静态参数的内容并编写A<"int">
或A<"string">
。您还可以将普通的非提供泛型类型与非泛型提供的类型混合在一起(以某种巧妙的方式)。但我认为你需要写更多关于你的具体用例以获得更好的答案。